Лучший способ добавить параметр "ничего не выбран" в selectOneMenu в JSF

Мне было интересно, какой лучший или простой способ позволить пользователю ничего не выбирать в selectOneMenu.

Мой пример: у меня есть список зарегистрированных пользователей, и администратор должен иметь возможность фильтровать список отображаемых пользователей по некоторым критериям. Эти критерии, такие как usertype (employee, customer,...), могут быть выбраны selectOneMenus, например:

<h:selectOneMenu value="#{myBean.selectedUsertype}" converter="#{usertypeConverter}">
<f:selectItems value={myBean.usertypes}" />
</h:selectOneMenu>

Когда соответствующий selectOneMenu подкрепляется списком POJO с помощью конвертера, как я могу добавить элемент в список, указывающий, что пользователь не выбрал какой-либо конкретный элемент? В настоящее время у меня есть фиктивный объект usertype, отображающий метку "---", но это вызывает ряд проблем в других областях моего приложения, и я не думаю, что это лучшее решение.

Ответы

Ответ 1

Просто явно установите значение элемента выбора null.

<h:selectOneMenu value="#{bean.selectedItem}">
    <f:selectItem itemValue="#{null}" itemLabel="--select--" />
    <f:selectItems value="#{bean.availableItems}" />
</h:selectOneMenu>

Нет, пустой строки, такой как itemValue="", недостаточно. Это действительно должно быть null. В противном случае вы столкнетесь с проблемами, как описано в этом разделе Q & A: , используя " выберите " f: selectItem с нулевым/пустым значением внутри p: selectOneMenu.

Если это элемент required="true" и вы используете JSF 2.x, тогда вы можете добавить noSelectionOption="true" к выбранному элементу. Это полезно только в том случае, если вы также установили hideNoSelectionOption="true" для компонента выбора. Затем он скрывает пустую опцию в списке, когда конечный пользователь выбирает другой элемент, тем самым делая невозможным повторный выбор пустой опции.

<h:selectOneMenu value="#{bean.selectedItem}" hideNoSelectionOption="true">
    <f:selectItem itemValue="#{null}" itemLabel="--select--" noSelectionOption="true" />
    <f:selectItems value="#{bean.availableItems}" />
</h:selectOneMenu>

Ответ 2

Добавьте единственный selectItem с нулевым значением;

<h:selectOneMenu value="#{bean.question}" required="true" requiredMessage="Please select a question">
    <f:selectItem itemValue="#{null}" itemLabel="Select" />
    <f:selectItems value="#{bean.questions}" />
</h:selectOneMenu>

Ответ 3

Мы можем в простых гранях (когда мы должны использовать <p:selectOneMenu... по какой-то причине, например, используя <p:ajax..), добавьте следующий пустой элемент:

<f:selectItem itemValue="#{null}" itemLabel="--select--"  itemDisabled="#{Mybean.value ne null}" />

Примечание. В этом случае нам не нужны следующие два тега:

hideNoSelectionOption="true"

и

noSelectionOption="true"