我有一个复合组件,在选择项目时使用ajax更改多个元素 . 如果这有任何区别,我也使用Primefaces p:ajax 和 p: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,但响应不会更新计数器 . update 或 render 的所有不同值都不起作用 . 在显示的情况下,primefaces按钮似乎什么都不做,在JSF命令按钮的情况下,我得到一个对话框,上面写着:
malformedXML: During update: test2form:xyz not found
在我看来,这是复合组件中最简单的AJAX用法 . 任何人都可以解释可能发生的事情吗?
1 回答
你是对的,生成的HTML DOM树中没有一个HTML元素具有该ID . 复合组件的内容本身并不包含在JavaScript可以访问的一些通用HTML元素中 . 你基本上需要引入一些容器组件:
但我仍然想知道为什么
@form
不适合你 . 这个对我有用 .