Вопрос
У меня проблема с JSF. Кто-нибудь может сказать, почему это не работает?
<h:selectOneListbox
id="lang" size="5"
value="#{MbInstitution.node.lang}"
valueChangeListener="#{MbInstitution.changeLanguage}"
rendered="#{MbInstitution.view}"
>
<a4j:support event="onchange" reRender="shortDesc, fullDesc"/>
<f:selectItems value="#{MbInstitution.languagesByInstitute}"/>
</h:selectOneListbox>
<h:selectOneListbox
id="lang" size="5"
disabled="#{!MbInstitution.managingNew}"
value="#{MbInstitution.node.lang}"
rendered="#{!MbInstitution.view}"
>
<f:selectItems value="#{MbInstitution.availableLanguages}"/>
</h:selectOneListbox>
Там написано: " двойной идентификатор для компонента instForm: lang " Я знаю, что у меня есть 2 элемента с одинаковым идентификатором, но один отображается только тогда, когда другой нет. Так что я не думал, что это будет проблемой. На самом деле это совсем не большая проблема, так как мне не нужен этот идентификатор, но что если мне понадобится то, что я буду делать?
Решение
Ваша проблема в том, что эти два компонента являются частью дерева компонентов JSF для этой страницы. И даже если они не могут отображаться одновременно, они имеют один и тот же идентификатор, что не разрешено JSF.
Я вижу три способа решения вашей проблемы:
Первое решение: определите два разных идентификатора
Второе решение . Как объяснил Уэйн Янг, вы можете использовать NamingContainer, который будет добавлять префикс ID к идентификатору NamingContainer.
Третье решение: используйте только один <h:selectOneListbox/>
, а затем внесите изменения в код Java.
<h:selectOneListbox id="lang" size="5" disabled="#{!MbInstitution.managingNew}" value="#{MbInstitution.node.lang}" valueChangeListener="#{MbInstitution.changeLanguage}">
<a4j:support event="onchange" reRender="shortDesc, fullDesc" rendered="#{MbInstitution.view}"/>
<f:selectItems value="#{MbInstitution.languages}"/>
</h:selectOneListbox>
Java-код:
public List<SelectItem> getLanguage() {
if (isView()) {
return getLanguagesByInstitute();
} else {
return getAvailableLanguages();
}
}
public void changeLanguage(ValueChangeEvent evt) {
if (!isView()) {
return;
}
...
}
Другие советы
Вам придется использовать другой идентификатор или поместить его в другой контейнер имен. Р>
Javadoc для UIComponent.setId () говорит:
Указанный идентификатор должен быть уникальный среди всех компонентов (включая аспекты), которые потомки ближайшего предка UIComponent, который является NamingContainer, или в рамках всего составное дерево, если такого нет предок, который является NamingContainer.