当为其他组件指定了process属性时,PrimeFaces Ajax Listener未执行

jFr*_*tic 8 primefaces jsf-2

当我指定标签的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}" />
Run Code Online (Sandbox Code Playgroud)

和控制器:

@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
  }
}
Run Code Online (Sandbox Code Playgroud)

phaseListenerANY_PHASE PhaseId附加了一个视图,这是我观察到的.

当我指定processattribute时,inputToProcess输入的值在Update Model阶段成功设置到控制器(不会发生异常).然后执行Invoke ApplicationRender Response阶段,但不调用侦听器.我注意到的一件事是最后没有设置复选框.但是,没有转换或验证错误,因为正如我所说,Update Model并且Invoke Application阶段被执行.

如果我省略process属性,这就是我所看到的:通常在Invoke Application阶段调用监听器(immediate默认情况下为false),然后执行"渲染响应".复选框已成功设置.

对这种行为有什么解释吗?

Bal*_*usC 15

它应该一见钟情.至少,在使用标准JSF组件时,它的工作方式很好.我敢打赌它是PrimeFaces的一个bug或"特性",当动作组件不包含在动作组件中时它不会处理动作process.添加@thisprocess应该解决它.考虑向PrimeFaces人员发布问题报告.

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


根据你的评论:

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

这不是真的.可能你正在使用valueChangeListener而不是<f:ajax listener>混淆或混淆另一个.该<f:ajax listener>过程中调用动作阶段总是调用.

  • 是的,它确实.对于`UIInput`组件,默认值始终为`event ="valueChange"`,对于`UICommand`组件,默认值为`event ="action"`.在`UIInput`组件上,它将转换为HTML input/select/textarea元素的`change`和HTML单选/复选框元素的`click`. (2认同)