2009-09-15 5 views
4

J'ai un problème avec JSF. Quelqu'un peut-il dire pourquoi cela ne fonctionne pas?Id dupliqué 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> 

Il dit: « double Id pour une instForm composante: lang » Je sais que j'ai 2 éléments avec la même Id, mais on est rendu que lorsque l'autre est non. Donc, je ne pensais pas que ce serait un problème. En fait, ce n'est pas un gros problème du tout car je n'ai pas besoin de cette identification, mais si j'avais besoin alors que ferais-je?

Répondre

11

Votre problème est que ces deux composants font partie de l'arborescence des composants JSF pour cette page. Et même s'ils ne peuvent pas être affichés en même temps, ils partagent le même ID, ce qui n'est pas autorisé par JSF.

Je vois trois solutions pour résoudre votre problème:

Première solution: Define deux differents ID

Deuxième solution: Vous pouvez, comme l'explique Wayne Young, utiliser un NamingContainer, qui sera préfixe leur ID par l'ID du NamingContainer.

Troisième solution: Utilisez uniquement un <h:selectOneListbox/> puis faites la différence dans le code 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> 

code Java:

public List<SelectItem> getLanguage() { 
    if (isView()) { 
     return getLanguagesByInstitute(); 
    } else { 
     return getAvailableLanguages(); 
    } 
} 

public void changeLanguage(ValueChangeEvent evt) { 
    if (!isView()) { 
     return; 
    } 
    ... 
} 
+0

Merci! C'est juste ce que je voulais (troisième solution). C'est si simple que je suis confus je ne pouvais pas le trouver par moi-même. :) – mykola

+0

qu'en est-il du conteneur de nommage? Je ne comprends pas, et la question crosspost http://stackoverflow.com/questions/3449370/jsf-how-to-create-a-naming-container n'explique pas quelque chose de bon à mes yeux – Toskan

1

Vous devrez utiliser un ID différent ou le placer dans un autre conteneur de dénomination.

Le Javadoc for UIComponent.setId() dit:

L'identificateur spécifié doit être unique parmi tous les composants (y compris les facettes) qui sont descendants de l'ancêtre le plus proche UIComponent qui est un NamingContainer, ou dans le portée de l'intégralité de l'arborescence des composants s'il n'existe aucun ancêtre qui est un NamingContainer.