Повторяющийся идентификатор. JSF

У меня проблема с 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 элемента с одинаковым идентификатором, но один отображается только тогда, когда другой нет. Так что я не думал, что это будет проблемой. На самом деле это не большая проблема, так как мне не нужен этот идентификатор, но что, если мне нужно, что я буду делать?


person mykola    schedule 15.09.2009    source источник


Ответы (2)


Ваша проблема в том, что эти два компонента являются частью дерева компонентов JSF для этой страницы. И даже если они не могут отображаться одновременно, они имеют один и тот же идентификатор, что не разрешено JSF.

Я вижу три решения для решения вашей проблемы:

Первое решение: определить два разных идентификатора

Второе решение: вы можете, как объяснил Уэйн Янг, использовать NamingContainer, который будет ставить перед своим идентификатором идентификатор 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;
    }
    ...
}
person Romain Linsolas    schedule 16.09.2009
comment
Спасибо! Это именно то, что я хотел (третье решение). Это так просто, что я запутался, я не мог найти его сам. :) - person mykola; 16.09.2009
comment
как насчет контейнера имен? Я не понимаю и задаю вопрос кросспост stackoverflow.com/questions/3449370/ не объясняет что-то хорошее в моих глазах - person Toskan; 10.08.2011

Вам придется использовать другой идентификатор или поместить его в другой контейнер именования.

Javadoc для UIComponent.setId() говорит:

Указанный идентификатор должен быть уникальным среди всех компонентов (включая фасеты), являющихся потомками ближайшего предка UIComponent, который является NamingContainer, или в рамках всего дерева компонентов, если такого предка, который является NamingContainer, нет.

person Billy Bob Bain    schedule 15.09.2009