JSF: как обновить обязательное поле в запросе ajax - PullRequest
4 голосов
/ 11 января 2011

Хорошо, вот основная проблема.

Страница. У меня есть два обязательных «ввода текста». Командная кнопка, которая изменяет значение bean-компонента и возвращает объект «задание».

<a4j:form id="pervForm">  
    SURNAME:<h:inputText id="surname" label="Surname" value="#{prevManager.surname}" required="true" />  
    <br/>               
    JOB:<h:inputText  value="#{prevManager.job}"  id="job"  maxlength="10" size="10"  label="#{msg.common_label_job}" required="true" />  
    <br/>  

    <a4j:commandButton value="Set job to Programmer" ajaxSingle="true" reRender="job">  
        <a4j:actionparam name="jVal" value="Programmer" assignTo="#{prevManager.job}"/>  
    </a4j:commandButton>  

    <h:commandButton id="save" value="save"  action="save" class="HATSBUTTON"/>  

</a4j:form>  

Вот простой менеджер:

public class PrevManager   
{  

    private String surname;  
    private String job;  

    public String getSurname()  
    {  
        return surname;  
    }  

    public void setSurname(String surname)  
    {  
        this.surname = surname;  
    }  

    public String getJob()  
    {  
        return job;  
    }  

    public void setJob(String job)  
    {  
        this.job = job;  
    }  

    public String save()  
    {  
        //do something  
    }  

}  

Давайте сделаем это:

Напишите что-нибудь в тексте ввода задания (например, «учитель»). Оставьте пустую фамилию. Сохранить. Появляется ошибка проверки (фамилия обязательна). Нажмите «Задать программисту»: ничего не происходит.

Проверяя значение bean-компонента, я обнаружил, что оно корректно обновляется, действительно, компонент на странице не обновляется!

Ну, в соответствии с документами JBoss, которые я нашел:

Область Ajax является ключевым компонентом Ajax. Это ограничивает часть компонента дерево для обработки на сервере сторона, когда приходит запрос ajax. Обработка означает вызов во время Декодирование, проверка и обновление модели фаза. Наиболее распространенные причины использования регион являются:

- предотвращение прерывания обработки жизненного цикла JSF во время проверка правильности ввода другой формы ненужный для данного запроса ajax; -определение различных стратегий, когда события будут доставлены (Немедленная = "истина / ложь") -отображение индивидуального индикатора состояния AJAX -повышение производительности обработки рендеринга (SelfRendered = "истина / ложь", renderRegionOnly = "true / false")

Следующие два примера показывают ситуация, когда ошибка проверки не позволяет обрабатывать вход ajax. Введите имя Выходной текст компонент должен появиться после вас. Однако в первом случае это активность будет прервана из-за другое поле с обязательным = "истина". Вы увидите только сообщение об ошибке пока поле "Работа" пусто.

Вот вам пример:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"  
      xmlns:ui="http://java.sun.com/jsf/facelets"  
      xmlns:h="http://java.sun.com/jsf/html"  
      xmlns:f="http://java.sun.com/jsf/core"  
      xmlns:a4j="http://richfaces.org/a4j"  
      xmlns:rich="http://richfaces.org/rich">  

        <style>  
            .outergridvalidationcolumn {  
                padding: 0px 30px 10px 0px;  
            }  
        </style>  

    <a4j:outputPanel ajaxRendered="true">  
        <h:messages style="color:red" />  
    </a4j:outputPanel>  
    <h:panelGrid columns="2" columnClasses="outergridvalidationcolumn">  

        <h:form id="form1">  
                <h:panelGrid columns="2">  
                    <h:outputText value="Name" />  
                    <h:inputText value="#{userBean.name}">  
                        <a4j:support event="onkeyup" reRender="outname" />  
                    </h:inputText>  
                    <h:outputText value="Job" />  
                    <h:inputText  required="true" id="job2" value="#{userBean.job}" />  
                </h:panelGrid>  
        </h:form>  

        <h:form id="form2">  
            <h:panelGrid columns="2">  
                <h:outputText value="Name" />  
                <a4j:region>  
                    <h:inputText value="#{userBean.name}">  
                        <a4j:support event="onkeyup" reRender="outname" />  
                    </h:inputText>  
                </a4j:region>  
                <h:outputText value="Job" />  
                <h:inputText   required="true"  id="job1"  value="#{userBean.job}" />  
            </h:panelGrid>  
        </h:form>  

    </h:panelGrid>  
    <h:outputText id="outname" style="font-weight:bold" value="Typed Name: #{userBean.name}" />  
    <br />  
</ui:composition>  

Форма 1: поведение некорректно. Мне нужно заполнить работу, а затем имя. Форма 2: поведение правильное. Мне не нужно заполнять работу, чтобы увидеть правильное значение.

К сожалению, использование области Ajax не помогает (действительно, я использовал это неправильно ...), потому что мои поля ОБЯЗАТЕЛЬНЫ. Это главное другое.

Есть идеи?

Большое спасибо.

Ответы [ 3 ]

3 голосов
/ 29 января 2013

Эта проблема также определена в JSF 2 и подробно объяснена в следующем ответе: Как заполнить текстовое поле с помощью PrimeFaces AJAX после возникновения ошибок проверки?

Суммируя,Ответ заключается в том, что вам нужно очистить состояние компонента EditableValueHolder, когда он собирается быть отрендеренным с помощью ajax, но который не включен в ajax-execute, путем вызова методов setValue(null), setSubmittedValue(null), setLocalValueSet(false), setValid(true).Примечание: в JSF 2 вместо этого вы бы использовали удобный метод resetValue().

Учитывая, что в поле ввода "job" есть идентификатор клиента prevForm:job, вот как можно очиститьвнутри метода прослушивателя действий, связанного с кнопкой «Задать программисту»:

UIInput input = (UIInput) context.getViewRoot().findComponent("prevForm:job");
input.setValue(null);
input.setSubmittedValue(null);
input.setLocalValueSet(false);
input.setValid(true);
0 голосов
/ 13 января 2011

Когда вы нажимаете «Установить задание для программиста», ничего не происходит, потому что вы не переопределяете свой компонент сообщения.Если вы это сделаете, вы сможете увидеть сообщение о проверке.

Вам необходимо повторно оформить сообщение, потому что оно <a4j:commandButton/>, а не просто <h:commandButton/>

Попробуйте использоватьдвигательныйimmediate в кнопке «Установить задание для программиста» и проверьте, обновит ли это поле.

<a4j:commandButton value="Set job to Programmer" ajaxSingle="true" reRender="job" immediate="true">
    <a4j:actionparam name="jVal" value="Programmer" assignTo="#{prevManager.job}"/>  
</a4j:commandButton>

* Я не думаю, что здесь необходим «ajaxSingle» ..

Может быть, вы можете получитьновая проблема .. при использовании immediate значение компонента не будет обновлено (МОЖЕТ БЫТЬ!).Если это произойдет, создайте метод bean-компонента, который устанавливает значение bean-компонента вручную.

В противном случае, если значение bean-компонента было обновлено, а поле все еще пустое, попробуйте поместить поле "job" в <a4j:outputPanel/> и reRenderВыходная панель.

<a4j:outputPanel id="myPanel">
   <h:inputText  value="#{prevManager.job}"  id="job"  maxlength="10" size="10"  label="#{msg.common_label_job}" required="true" />
</a4j:outputPanel/>

<a4j:commandButton value="Set job to Programmer" reRender="myPanel" immediate="true">
    <a4j:actionparam name="jVal" value="Programmer" assignTo="#{prevManager.job}"/>  
</a4j:commandButton>

Подробнее о <a4j:outputPanel/> здесь .

0 голосов
/ 11 января 2011

Использование a4j: actionparam установит значение, но не поможет вам обойти проверку в этом случае.Проверка происходит на компоненте (а не на свойстве компонента).Таким образом, при отправке значение компонента все еще остается пустым.Надеюсь это поможет.

...