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

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

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

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

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

3 ответа

Решение

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

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

Нет, пустая строка вроде itemValue="" недостаточно Это действительно должно быть null, В противном случае вы столкнетесь с проблемами, как описано в этом разделе " Вопросы и ответы". Использование "Пожалуйста, выберите" f:selectItem с нулевым / пустым значением внутри ap: 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>

Добавьте единственный 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>

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

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

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

hideNoSelectionOption="true"

а также

noSelectionOption="true"
Другие вопросы по тегам