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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top