首页 文章

如何在复合组件中找到更新/渲染参数?

提问于
浏览
1

我有一个复合组件,在选择项目时使用ajax更改多个元素 . 如果这有任何区别,我也使用Primefaces p:ajaxp:commandButton 而不是 f:ajax .

问题是我无法在组件上找到正确的 update 属性,以便整个组件更新 . 例如,在以下按钮中:

<p:commandButton id="slGoUSA"
         value="USA" 
         rendered="#{cc.USAButtonOn}"
         actionListener="#{cc.doSetUSA}"
         update="???"  />

我尝试了以下所有内容,但没有一个能够正常工作:

update="@this"
update="@form"
update="#{cc.clientId}"
update=":#{cc.clientId}"
update="#{cc.clientId}:localID"
update=":#{cc.clientId}:localID"

唯一可行的是:

update="#{cc.attrs.update}"

然后客户端页面传递一些包含复合组件的clientId . 但是,我不想强制用户在组件调用中包含更新参数 . 这样做有方便吗?


更新

好吧,如果我展示完整的测试用例,我认为这可能会有所帮助 . 我实现了一个UINamingContainer来支持复合组件,如下所示:

/*
 * Test code
 */
package com.myapp.app.component;

import java.io.Serializable;
import javax.faces.component.FacesComponent;
import javax.faces.component.UINamingContainer;

@FacesComponent(value="qctest")
public class Qctest extends UINamingContainer implements Serializable {

private enum StateKey { Counter }

public Qctest() { }

@Override
public String getFamily() { return "javax.faces.NamingContainer"; }

public Integer getCounter() {
    Integer i = (Integer) getStateHelper().get(StateKey.Counter);
    if (i == null) i = Integer.valueOf(1);
    else i += 1;
    getStateHelper().put(StateKey.Counter, i);
    return i;
}
}

然后cc定义如下所示:

<!-- INTERFACE -->
<cc:interface componentType="qctest">
</cc:interface>

<!-- IMPLEMENTATION -->
<cc:implementation>

    <h:outputText id="outText" value="Counter is now: #{cc.counter}" />
    
<p:commandButton value="Hit Me" update=":#{cc.clientId}" />
<h:commandButton value="Or Hit Me" > <f:ajax render=":#{cc.clientId}"/> </h:commandButton> </cc:implementation> </html>

这段代码基本上是OMG我的第一个AJAX页面!应用程序,除了它在复合组件内部而不是具有普通辅助bean的常规页面 .

两个按钮都没有成功进行更新 . Firebug显示正在发送的XHR,但响应不会更新计数器 . updaterender 的所有不同值都不起作用 . 在显示的情况下,primefaces按钮似乎什么都不做,在JSF命令按钮的情况下,我得到一个对话框,上面写着:

malformedXML: During update: test2form:xyz not found

在我看来,这是复合组件中最简单的AJAX用法 . 任何人都可以解释可能发生的事情吗?

1 回答

  • 1

    malformedXML:更新期间:test2form:找不到xyz

    你是对的,生成的HTML DOM树中没有一个HTML元素具有该ID . 复合组件的内容本身并不包含在JavaScript可以访问的一些通用HTML元素中 . 你基本上需要引入一些容器组件:

    <cc:implementation>
        <h:panelGroup id="container">  
            ...
            <h:commandButton value="submit">
                <f:ajax render="container" />
            </h:commandButton>
            ...
            <p:commandButton value="submit" update="container" />
            ...
        </h:panelGroup>
    </cc:implementation>
    

    但我仍然想知道为什么 @form 不适合你 . 这个对我有用 .

相关问题