当我指定标签的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)
我phaseListener用ANY_PHASE PhaseId附加了一个视图,这是我观察到的.
当我指定processattribute时,inputToProcess输入的值在Update Model阶段成功设置到控制器(不会发生异常).然后执行Invoke Application和Render Response阶段,但不调用侦听器.我注意到的一件事是最后没有设置复选框.但是,没有转换或验证错误,因为正如我所说,Update Model并且Invoke Application阶段被执行.
如果我省略process属性,这就是我所看到的:通常在Invoke Application阶段调用监听器(immediate默认情况下为false),然后执行"渲染响应".复选框已成功设置.
对这种行为有什么解释吗?
Bal*_*usC 15
它应该一见钟情.至少,在使用标准JSF组件时,它的工作方式很好.我敢打赌它是PrimeFaces的一个bug或"特性",当动作组件不包含在动作组件中时它不会处理动作process.添加@this到process应该解决它.考虑向PrimeFaces人员发布问题报告.
此外,我宁愿使用event="valueChange"或event="click"代替event="change"或仅删除event它,它默认为正确的值(valueChange将onclick在复选框和单选按钮组件中呈现).change对于复选框和单选按钮,事件在MSIE中的工作方式不同.它仅在第二次点击时触发.您不希望依赖浏览器.
根据你的评论:
标准JSF复选框和ajax组件的问题是在Process Validations阶段调用了侦听器,但我需要先更新模型!
这不是真的.可能你正在使用valueChangeListener而不是<f:ajax listener>混淆或混淆另一个.该<f:ajax listener>过程中调用动作阶段总是调用.
| 归档时间: |
|
| 查看次数: |
25044 次 |
| 最近记录: |