Validation 当必需的输入字段变为空时,不会触发PrimeFaces ajax更新

Validation 当必需的输入字段变为空时,不会触发PrimeFaces ajax更新,validation,jsf,input,primefaces,xhtml,Validation,Jsf,Input,Primefaces,Xhtml,我将JSF与PrimeFaces一起使用,字段如下 <p:outputLabel for="vehicle" value="#{msg['vehicle.text']}" /> <p:autoComplete id="vehicle" value="#{newCtrlr.vehicleId.vehicle}" autocomplete="true" scrollHeight = "200" required = "true" completeMetho

我将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更新,因此市场仍处于启用状态。如果我移除车上的“必需”,一切正常。我想知道是否有一种方法可以使inputText成为必需的,并在必需字段中的值更改为空/空时触发ajax更新

首先,此行为是默认的JSF行为:如果输入无效,则不会写入模型。 因此,您必须手动更改此行为,例如使用事件侦听器

将以下方法添加到支持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:事件添加到p:自动完成:

<p:autoComplete ...>
    ...
    <f:event type="postValidate" listener="#{newCtrlr.setModelValueToNullIfValidationFailed}" />
</p:autoComplete>

...