这是我的复选框。我正在侦听器中准备逗号分隔的组件ID字符串。这里的问题是在调用侦听器之前调用getter getUpdateComponentList()。所以字符串永远不会更新。
<p:outputPanel>
<h:selectManyCheckbox value="#{form.colors}">
<f:selectItems value="#{form.colorItems}"/>
<p:ajax listener="#{form.testListener}" event="change" update="#{form.updateComponentList}" />
</h:selectManyCheckbox>
</p:outputPanel>
答案 0 :(得分:10)
这是预期的行为。 PrimeFaces(和标准JSF)不会在每个请求的基础上重新评估update
(以及render
,oncomplete
等)属性。它们是基于每个视图进行评估的。例如,RichFaces在其<a4j:ajax>
中执行此操作,并准确地产生预期的行为。
对于PrimeFaces,最好的办法是删除update
属性,然后在操作方法中使用RequestContext#addPartialUpdateTarget()
或#addPartialUpdateTargets()
。
E.g。
RequestContext.getCurrentInstance().addPartialUpdateTargets(updateComponentList);
需要Collection<String>
,例如List<String>
或Set<String>
。
顺便说一下,event="change"
是不必要的。只需使用组件的默认事件。
更新,并且无法找到在较新的PrimeFaces版本中确实删除的上述方法;请改用两种update()
方法中的一种(一种采用String
,另一种采用Collection<String>
。
RequestContext.getCurrentInstance().update(updateComponentList);
答案 1 :(得分:3)
我遇到了类似的'更新'在'听众'之前执行的问题。将两个'p:ajax' - 一个放在监听器中,另一个放在更新中 - 就可以了。
在你的情况下:
<p:outputPanel>
<h:selectManyCheckbox value="#{form.colors}">
<f:selectItems value="#{form.colorItems}"/>
<p:ajax event="change" listener="#{form.testListener}" />
<p:ajax event="change" update="#{form.updateComponentList}" />
</h:selectManyCheckbox>
</p:outputPanel>