Обновление ajax PrimeFaces не запускается, когда обязательное поле ввода становится пустым - PullRequest
0 голосов
/ 26 октября 2018

Я использую 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, когда значение изменяется на пустое / нулевое в обязательном поле.

1 Ответ

0 голосов
/ 26 октября 2018

Прежде всего, это поведение JSF по умолчанию: если ввод недопустим, он не записывается в модель.Таким образом, вы должны изменить это поведение вручную, например, с помощью Event-Listener.

Добавьте следующий метод к вашему компоненту:

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: к вашему p: autoComplete:

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