9

当我指定标签的process属性时p:ajax,不执行侦听器。如果我省略该process属性,则按预期调用侦听器。

这是视图片段:

<p:messages id="messages" />
<h:inputText id="inputToProcess" value="#{controller.inputToProcess}" />
<p:selectBooleanCheckbox id="testCheckbox" >
  <p:ajax event="change" process="inputToProcess"
    update="messages @this inputToUpdate"
    listener="#{controller.processChecked}" />
</p:selectBooleanCheckbox>
<h:inputText id="inputToUpdate" value="#{controller.inputToUpdate}" />

和控制器:

@javax.faces.bean.ManagedBean
@javax.faces.bean.ViewScoped
public class Controller implements Serializable {
  private String inputToProcess;
  private String inputToUpdate;
  //getters and setters

  public void processChecked(javax.faces.AjaxBehaviorEvent e) {
    // doing some stuff here
  }
}

我使用PhaseIdphaseListener将 a 附加到视图,这就是我观察到的。ANY_PHASE

当我指定process属性时,inputToProcess输入的值在更新模型阶段成功设置为控制器(不发生异常)。然后执行Invoke ApplicationandRender Response阶段,但不调用任何侦听器。我注意到的一件事是最后没有设置复选框。但是,没有转换或验证错误,因为正如我所说,Update ModelandInvoke Application阶段已执行。

如果我省略process属性,这是我看到的:通常在Invoke Application阶段期间调用侦听器(因为immediate默认情况下为 false),然后执行 `Render Response。复选框设置成功。

这种行为有什么解释吗?

4

1 回答 1

16

乍一看应该可以正常工作。至少,在使用标准 JSF 组件时,它可以正常工作。我敢打赌它是 PrimeFaces 的一个错误或“功能”,当动作组件不包含在process. 添加@thisprocess应该解决它。考虑向 PrimeFaces 人员发布问题报告。

此外,我宁愿使用event="valueChange"orevent="click"代替event="change"或完全删除event它,它已经默认为正确的值(valueChange它将呈现onclick在复选框和单选按钮组件中)。对于复选框和单选按钮,该change事件在 MSIE 中的工作方式不同。它仅在第二次单击时触发。您不想依赖浏览器。


根据您的评论:

标准 JSF 复选框和 ajax 组件的问题在于,在流程验证阶段调用了侦听器,但我需要先更新模型!

这不是真的。可能您正在使用valueChangeListener而不是<f:ajax listener>将其与另一个混淆。始终在<f:ajax listener>调用操作阶段调用。

于 2012-04-23T20:24:27.590 回答