2009-09-15 4 views
4

У меня проблема с 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> 

Он говорит: «Дубликат Id для компонента instForm: языки» Я знаю, что у меня есть 2 элементов с одинаковыми Id, но один визуализируется только тогда, когда другой нет. Поэтому я не думал, что это будет проблемой. На самом деле это не большая проблема, так как мне не нужен этот идентификатор, но что, если мне нужно, что бы я сделал?

ответ

11

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

Я вижу три решения, чтобы решить вашу проблему:

Первое решение: определить два Differents ID

Второе решение: Вы можете, как пояснил Уэйн Янг, использовать 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; 
    } 
    ... 
} 
+0

Спасибо! Это то, что я хотел (третье решение). Это так просто, что я смущен, что не могу найти его сам. :) – mykola

+0

как насчет контейнера именования? Я не понимаю, и вопрос о перекрестке http://stackoverflow.com/questions/3449370/jsf-how-to-create-a-naming-container не объясняет что-то хорошее в моих глазах – Toskan

1

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

Javadoc for UIComponent.setId() говорит:

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

 Смежные вопросы

  • Нет связанных вопросов^_^