我正在将JSF与PrimeFaces结合使用,如下所示。
<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更新,因此市场保持启用状态。如果我删除了Vehicle上的“ required”,一切正常。我想知道是否有一种方法可以使inputText成为必需,以及在将必需字段中的值更改为empty / null时触发ajax更新。
答案 0 :(得分:1)
首先,此行为是默认的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);
}
此方法检查组件的验证是否失败。如果是这样,则将模型值设置为null。
将f:event添加到您的p:autoComplete:
<p:autoComplete ...>
...
<f:event type="postValidate" listener="#{newCtrlr.setModelValueToNullIfValidationFailed}" />
</p:autoComplete>