Избегать обязательных = истинное ограничение поля ввода при изменении выбора в раскрывающемся списке - PullRequest
1 голос
/ 11 февраля 2011

У меня есть выпадающий список и текстовое поле рядом с ним. В зависимости от значения, выбранного в раскрывающемся списке, я меняю тип текстового поля, например меняю его на дату, целое число, текст. Для этих текстовых полей обязательный атрибут имеет значение true.

Таким образом, когда я выбираю другое значение в раскрывающемся списке, я могу изменить тип текстового поля, но я также получаю сообщение об ошибке в текстовом поле. Как я могу избежать этого?

Я использую JSF 1.2.

<h:selectOneMenu id="SelectField"  
    value="#{logSearchBean.searchType}"    
    onchange="this.form.submit();"
    valueChangeListener="#{logSearchBean.searchValueType}" >
    <f:selectItems  value="#{logSearchBean.columnDesc}" />
</h:selectOneMenu>

<h:inputText id="SearchText"
    value="#{logSearchBean.searchValue}"
    required="true"
    requiredMessage="Please provide value to Search for"
    rendered="#{logSearchBean.searchValueEditor eq 'SearchText'}"/>

<t:inputDate id="SearchDate"
    value="#{logSearchBean.searchValueDate}"
    popupCalendar="true"
    required="true"
    requiredMessage="Please provide value to Search for"
    rendered="#{logSearchBean.searchValueEditor eq 'SearchDate'}"/>

1 Ответ

1 голос
/ 12 февраля 2011

Вам нужно сделать две вещи:

  1. Добавьте immediate="true" к раскрывающемуся списку.

    <h:selectOneMenu immediate="true">
    

    Это приведет к тому, что метод valueChangeListener будет вызываться на этапе применения значений запроса, а не на этапе проверки. Таким образом, он будет вызван на одну фазу раньше, чем обычно, и все остальные поля ввода без immediate="true" еще не обработаны в этой точке.

  2. В методе valueChangeListener, связанном с раскрывающимся списком, вызовите FacesContext#renderResponse().

    FacesContext.getCurrentInstance().renderResponse();
    

    Это заставит JSF обходить все оставшиеся фазы до фазы ответа рендеринга. Таким образом, другие поля ввода без immediate="true" больше не будут обрабатываться.

...