p:在侦听器之前调用ajax getter进行更新

时间:2012-03-15 16:16:24

标签: jsf primefaces

这是我的复选框。我正在侦听器中准备逗号分隔的组件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>

2 个答案:

答案 0 :(得分:10)

这是预期的行为。 PrimeFaces(和标准JSF)不会在每个请求的基础上重新评估update(以及renderoncomplete等)属性。它们是基于每个视图进行评估的。例如,RichFaces在其<a4j:ajax>中执行此操作,并准确地产生预期的行为。

对于PrimeFaces,最好的办法是删除update属性,然后在操作方法中使用RequestContext#addPartialUpdateTarget()#addPartialUpdateTargets()

E.g。

RequestContext.getCurrentInstance().addPartialUpdateTargets(updateComponentList);

需要Collection<String>,例如List<String>Set<String>

顺便说一下,event="change"是不必要的。只需使用组件的默认事件。


对于稍后阅读此答案的较新PrimeFaces版本的用户,

更新,并且无法找到在较新的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>