Question
J'ai un problème avec JSF. Quelqu'un peut-il dire pourquoi cela ne fonctionne pas?
<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>
On dit: & "; dupliquer l'ID d'un composant instForm: lang &"; Je sais que j'ai 2 éléments avec le même identifiant, mais l'un n'est rendu que lorsqu'un autre ne l'est pas. Donc, je ne pensais pas que ce serait un problème. En fait, ce n’est pas un gros problème car je n’ai pas besoin de cet identifiant, mais si j’avais besoin de quoi faire alors?
La solution
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 identifiant, ce qui n’est pas autorisé par JSF.
Je vois trois solutions pour résoudre votre problème:
Première solution: définir deux identifiants différents
Deuxième solution: , comme l'a expliqué Wayne Young, vous pouvez utiliser un NamingContainer, qui préfixera son identifiant par l'identifiant du NamingContainer.
Troisième solution: n'utilisez qu'un seul <h:selectOneListbox/>
et faites ensuite 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;
}
...
}
Autres conseils
Vous devrez utiliser un identifiant différent ou le placer dans un autre conteneur de nommage.
Le Javadoc pour UIComponent.setId () dit:
L'identifiant 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 cadre de l'ensemble arborescence des composants s'il n'y a pas une telle ancêtre qui est un NamingContainer.