PrimeFaces CommandLink结合隐藏输入与AJAX时行为不一致问题求助
JSF中隐藏输入与带AJAX的PrimeFaces CommandLink行为不一致问题
在JSF项目中,结合<h:inputHidden>和带AJAX的PrimeFaces <p:commandLink>时,出现执行顺序不稳定的问题:
预期流程是先触发onclick事件调用backingBean1.setSomeField方法设置字段,再由CommandLink处理隐藏输入并触发验证器,但实际情况中两者的执行顺序随机,导致验证器有时会获取到未更新的属性值。
相关代码如下:
<p:fieldset id="someFieldset"> <h:inputHidden> <f:validator validatorId="myValidator"/> <f:attribute name="input1" value="#{backingBean1.someField}"/> <f:attribute name="input2" value="#{backingBean2.someOtherField}"/> </h:inputHidden> <p:dataTable id="someTable" value="..." var="someVar"> <p:column> .... </p:column> .... <p:column> <p:commandLink id="deleteBtn" process="someForm:someFieldset" rendered="..." oncomplete="if (args && !args.validationFailed) {PF('someDialog').show()}"> <f:ajax type="onclick" listener="#{backingBean1.setSomeField(someVar.reference)}" /> </p:commandLink> </p:column> </p:dataTable> </p:fieldset>
解决方法
要确保setSomeField方法在验证器之前执行,可通过以下方式处理:
移除嵌套的
<f:ajax>标签,改用PrimeFaces自身的事件处理
PrimeFaces的<p:commandLink>本身内置AJAX支持,嵌套标准JSF的<f:ajax>会导致事件执行顺序冲突,引发不可控的行为。直接使用actionListener属性绑定setter方法,它会在JSF生命周期的应用请求值阶段执行,早于验证阶段,能保证顺序正确:<p:commandLink id="deleteBtn" process="someForm:someFieldset" rendered="..." oncomplete="if (args && !args.validationFailed) {PF('someDialog').show()}" actionListener="#{backingBean1.setSomeField(someVar.reference)}"> </p:commandLink>确认隐藏输入的属性绑定正确性
确保<f:attribute>的input1直接绑定到backingBean1.someField,这样当setSomeField执行后,验证器能直接获取到更新后的属性值,避免因绑定方式导致的取值延迟。
内容的提问来源于stack exchange,提问作者Annanraen
相关产品推荐
相关产品推荐

