validation - 当必需的输入字段为空时,不会触发 PrimeFaces ajax 更新
问题描述
我正在使用带有 PrimeFaces 的 JSF,其字段如下所示。
<p:outputLabel for="vehicle" value="#{msg['vehicle.text']}" />
<p:autoComplete id="vehicle" value="#{newCtrlr.vehicleId.vehicle}" autocomplete="true" scrollHeight = "200" required = "true"
completeMethod="#{newCtrlr.vehicle_AutoComplete}" minQueryLength = "2">
<p:ajax event="itemSelect" listener = "#{newCtrlr.onVehicleChange}" update = "market" />
<p:ajax event="change" listener = "#{newCtrlr.onVehicleChange}" update = "market" />
</p:autoComplete>
<p:outputLabel for="market" value="#{msg['market.text']}" />
<p:inputText id="market" value="#{newCtrlr.market.marketName}"
readonly = "#{empty newCtrlr.vehicleId.vehicle ? 'true' :'false' }" />
在上面的代码中,如果输入了车辆价值,市场应该是可编辑的。如果车辆价值被清除,市场应该变成只读的。现在,由于车辆输入是“必需的”,因此不会触发 ajax 更新,因此市场保持启用状态。如果我删除车辆上的“必需”,一切正常。我想知道是否有办法使 inputText 成为必需,并在必填字段中的值更改为空/null 时触发 ajax 更新。
解决方案
首先,这种行为是默认的 JSF 行为:如果输入无效,则不会写入模型。因此,您必须手动更改此行为,例如使用事件侦听器。
将以下方法添加到您的 Backing-Bean:
public void setModelValueToNullIfValidationFailed(ComponentSystemEvent event) throws AbortProcessingException {
UIInput input = (UIInput) event.getComponent();
if (input.isValid()) {
return;
}
input.getValueExpression("value").setValue(FacesContext.getCurrentInstance().getELContext(), null);
}
此方法检查组件的验证是否失败。如果是这样,则模型值设置为空。
将 f:event 添加到您的 p:autoComplete 中:
<p:autoComplete ...>
...
<f:event type="postValidate" listener="#{newCtrlr.setModelValueToNullIfValidationFailed}" />
</p:autoComplete>
推荐阅读
- scala - Scala Slick - 确定哪个 DBIO 在 DBIO.sequence 中失败
- firebase - Flutter - Firestore 在 inistate 语句上将空数据返回到地图
- go - 泛型的新提议是否与旧版本向后兼容
- javascript - 使用 querySelectorAll() :not() 查找 not event.target
- c# - 如何更改实例进程的创建?(例如:DI,工厂...)
- python - 无法删除 Windows 10 中的尾随换行符
- azure - 尝试在 ADO 云版本中添加新的工作项类型“反馈请求”,但它表明它已在使用中
- flutter - Flutter ListView.builder 和 Provider 意外行为
- python - Discord Bot Python 3.9 错误 [未解决的导入'discord.ext.tasks']
- vba - 为什么(Outlook vba api)AdvancedSearch 在搜索发送给某人的电子邮件时返回错误的电子邮件结果?