我有一个复合组件,当选择一个项目时,它使用ajax来更改多个元素。我也使用Primefaces p:ajax 和 p:commandButton 而不是 f:ajax ,如果这有任何区别。
问题是我无法在组件上找到正确的更新属性,以便整个组件更新。例如,在以下按钮中:
<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}" />
<br/>
<p:commandButton value="Hit Me" update=":#{cc.clientId}" />
<br/>
<h:commandButton value="Or Hit Me" >
<f:ajax render=":#{cc.clientId}"/>
</h:commandButton>
</cc:implementation>
</html>
这段代码基本上就是OMG我的第一个AJAX页面!应用程序,除了它在复合组件内,而不是具有普通支持bean的常规页面。
两个按钮都没有成功进行更新。 Firebug显示正在发送的XHR,但响应不会更新计数器。 更新或呈现的所有不同值都不起作用。在显示的情况下,primefaces按钮似乎什么都不做,在JSF命令按钮的情况下,我得到一个对话框,上面写着:
malformedXML: During update: test2form:xyz not found
在我看来,这是复合组件中最简单的AJAX用法。谁能解释一下可能会发生什么?
答案 0 :(得分: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
不适合你。它对我有用。