Primefaces必填Calendar组件清空时Ajax监听器未触发问题求助
原因分析
这是JSF生命周期的验证机制导致的:当p:calendar设置required="true"时,清空值会触发必填验证失败。JSF在验证阶段失败后,会直接跳过后续的更新模型值和调用监听器步骤,因此calReqChange()不会被执行,myBean.calReqObj也无法更新为null。而可选组件没有必填验证,清空时验证通过,流程能正常走到监听器环节。
解决方案
要保留必填星号(required="true"会自动生成星号样式),同时让清空操作触发Ajax监听器,只需给p:ajax添加skipValidators="true"属性,让Ajax请求跳过组件的必填验证:
修改后的必填日历组件代码:
<p:outputLabel value="Calendar Required" for="calreq" /> <p:calendar label="Calendar Required" id="calreq" required="true" inputStyle="width: 100px;" showOn="button" value="#{myBean.calReqObj}" > <p:ajax event="dateSelect" listener="#{myAction.calReqChange()}" skipValidators="true"/> <p:ajax event="change" listener="#{myAction.calReqChange()}" skipValidators="true"/> </p:calendar>
skipValidators="true"是PrimeFacesp:ajax的专属属性,作用是让当前Ajax请求跳过所有验证步骤,这样即使组件值为空,也能正常执行监听器并更新Bean属性。- 表单提交时的必填验证依然有效,不会影响整体表单校验逻辑,同时也保留了标签旁的星号样式。
补充说明
你之前尝试的immediate=true无效的原因:它仅让组件在更早的阶段处理请求,但必填验证仍会触发,验证失败后流程依然中断;process=@this只是限定处理当前组件,不影响验证逻辑,因此必须通过skipValidators来跳过验证。
内容的提问来源于stack exchange,提问作者satya prakash Panigrahi
相关产品推荐
相关产品推荐

