2015-02-06 9 views
0

У меня возникает странная проблема с h: selectOneMenu.valueChangeListener вызывается, когда начальное значение является пустой строкой, а новое значение равно null

Я использую h: selectOneMenu в своем приложении JSF 2. Я создал Arraylist месяцев в классе контроллера, который присваивается h: selectOneMenu. Начальным элементом выпадающего списка является «Любой», значение которого является пустой строкой. Значение h: selectOneMenu привязывается к переменной класса объекта «месяц». Переменная месяц инициализируется как "" (пустая строка).

Я создал ValueChangeEvent на h: selectOneMenu. Я написал метод changeMonth (событие) в контроллере, который вызывается в событии изменения значения.

Моя проблема заключается в том, что это событие изменения значения срабатывает, когда я нажимаю кнопку отправки, даже если значение не изменяется. Это происходит только тогда, когда выпадающее меню имеет значение «Любой». Когда я попытался получить значения для изменения метода changeMonth, я получаю старое значение как «» (пустая строка), а новое значение равно null.

В идеале не следует запускать ValueChangeEvent. Но так как он меняется от пустого до нуля, это происходит. Почему это происходит? Это проблема с компонентом JSF 2 h: selectOneMenu?

Я вставив мой код контроллера:

@ManagedBean 
@SessionScoped 
public class Controller { 

private List monthList; 
private ObjClass searchVO; 

public List getMonthList() { 
    List<SelectItem> list = new ArrayList<SelectItem>(); 
    list.add(new SelectItem("", "Any")); 

    for (int i = 1; i <= 12; i++) { 
     list.add(new SelectItem(String.valueOf(i), "Month"+i)); 
    } 
    monthList = list; 
    return monthList; 
} 

/** 
* @param monthList 
*   the monthList to set 
*/ 
public void setMonthList(List monthList) { 

    this.monthList = monthList; 
} 
public ObjClass getSearchVO() { 
    if (searchVO == null) { 
     searchVO = new ObjClass(); 
    } 
    return searchVO; 
} 

public void setSearchVO(ObjClass searchVO) { 
    this.searchVO = searchVO; 
} 

public void changeMonth(ValueChangeEvent changeEvent) { 

    PhaseId phaseId = changeEvent.getPhaseId(); 
    String oldValue = (String) changeEvent.getOldValue(); 
    String newValue = (String) changeEvent.getNewValue(); 

} 

} 

Это мой Объект Класс:

public class ObjClass { 
public String getMonth() { 
    return month; 
} 

public void setMonth(String month) { 
    this.month = month; 
} 

private String month=""; 

public ObjClass(String month) { 
    super(); 
    this.month = month; 
} 
public ObjClass() { 
} 

} 

И это мой XHTML форма:

<h:form> 


    Dropdown example: 

    <h:selectOneMenu valueChangeListener="#{controller.changeMonth}" 
       onchange="submit();" id="month" 
       value="#{controller.searchVO.month}" title="Select Month"> 
       <f:selectItems value="#{controller.monthList}" /> 
    </h:selectOneMenu> 

     <br /><br /> 

    <h:outputText value="#{controller.searchVO.month}"></h:outputText> 
      <h:commandButton value="Submit" action="result" /> 
     <h:commandButton value="Reset" type="reset" /> 

    </h:form> 

ответ

0

Вместо добавления SelectItem("", "Any") к в списке, попробуйте заменить его на:

list.add(new SelectItem(null, "Any", null, false, true, true)); 

Дело в том, чтобы использовать noSelectionOption атрибут SelectItem (последний аргумент в конструктор, для которого мы присвоенного true), который указывает на то будет его вариант «нет выбора», получить подробную информацию о том, что атрибут может быть найден в SelectItem's Javadoc:

Флаг, указывающий, является ли параметр, созданный этим компонентом специальную опцию «нет выбора». Выражения должны оценивать в буле. Значение по умолчанию - false.

В отношении застройщика в SelectItem, используемого выше, это описание обеспечивается Javadocs:

SelectItem

public SelectItem(java.lang.Object value, 
        java.lang.String label, 
        java.lang.String description, 
        boolean disabled, 
        boolean escape, 
        boolean noSelectionOption) 

Построить экземпляр SelectItem с заданными значениями свойств.

Параметры:

value - Value to be delivered to the model if this item is selected by the user 
label - Label to be rendered for this item in the response 
description - Description of this item, for use in tools 
disabled - Flag indicating that this option is disabled 
escape - Flag indicating that the text of this option should be escaped when rendered. 
noSelectionOption - Flag indicating that the current option is a "no selection" option 
+0

Привет Тарика, что не работает. Не могли бы вы воспроизвести точный код на своем месте и рассказать мне, какие результаты вы наблюдаете? – Stacklin

+0

Хорошо, я попробую это позже сегодня – Tarik

+0

попробуйте это http://stackoverflow.com/a/6306137/4170582 – Tarik

 Смежные вопросы

  • Нет связанных вопросов^_^