Как установить метку h: selectOneMenu в качестве значения? - PullRequest
0 голосов
/ 01 сентября 2011

Я использую h:selectOneMenu и хочу получить не значение идентификатора, а метку. В бэк-бине я создаю SelectItem объекты, которые берутся для загрузки h:selectOneMenu.

new SelectItem("id", "label");

Код моего просмотра:

<h:selectOneMenu value="#{Metadata.thema}">
    <f:selectItems value="#{ThemaBean.themes}" /> 
    <f:valueChangeListener type="com.schober.events.SelectThemaEvent" />
</h:selectOneMenu>

Код здесь устанавливает Metadata.thema с помощью "id", но мне нужно установить "label". Я пытался с label="#{Metadata.thema}", но у меня это не работает.

1 Ответ

2 голосов
/ 01 сентября 2011

Тогда просто используйте метку в качестве значения. Вместо этого используйте конструктор SelectItem с одним аргументом:

new SelectItem("label");

Таким образом, метка будет использоваться и как значение элемента, и как метка элемента.


Обновление вы, похоже, неправильно сформулировали вопрос, и на самом деле хотите получить и то, и другое. В этом случае, просто удерживайте Map пар значений ID-метки самостоятельно и получите метку с карты по выбранному идентификатору.

private Map<Long, String> themaIdsAndLabels = new HashMap<Long, String>();

// ...

public void submit() {
    String themaLabel = themaIdsAndLabels.get(thema);
    // ...
}

Вы можете использовать этот Map для создания списка SelectItem и более, если вы используете JSF 2.0 и EL 2.2, вы также можете использовать эту карту прямо внутри <f:selectItems> без необходимости копировать ее в List<SelectItem>.

<f:selectItems value="#{bean.themaIdsAndLabels.entrySet()}" var="entry" itemValue="#{entry.key}" itemLabel="#{entry.value}" />

Или, если ваше единственное намерение состоит в том, чтобы снова отобразить метку в выходном тексте, вы также можете просто использовать

<h:outputText value="#{bean.themaIdsAndLabels[bean.thema]}" />
...