Domanda

Ho un problema con JSF. Qualcuno può dire perché questo non funziona?

<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>

Dice: " ID duplicato per un componente instForm: lang " So di avere 2 elementi con lo stesso ID, ma uno viene visualizzato solo quando un altro no. Quindi, non pensavo che sarebbe stato un problema. In realtà non è affatto un grosso problema in quanto non ho bisogno di questo ID, ma se avessi bisogno allora cosa farei?

È stato utile?

Soluzione

Il tuo problema è che questi due componenti fanno parte dell'albero dei componenti JSF per questa pagina. E anche se non possono essere visualizzati contemporaneamente, condividono lo stesso ID, che non è consentito da JSF.

Vedo tre soluzioni per risolvere il tuo problema:

Prima soluzione: definisce due ID diversi

Seconda soluzione: puoi, come spiegato da Wayne Young, utilizzare un NamingContainer, che anteporrà il loro ID con l'ID del NamingContainer.

Terza soluzione: usa solo una <h:selectOneListbox/> e fai la differenza nel codice 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>

Codice Java:

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

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

Altri suggerimenti

Dovrai utilizzare un ID diverso o inserirlo in un altro contenitore di denominazione.

Il Javadoc per UIComponent.setId () dice:

  

L'identificatore specificato deve essere   unico tra tutti i componenti   (comprese le sfaccettature) che lo sono   discendenti dell'antenato più vicino   UIComponent che è un NamingContainer,   o nell'ambito di applicazione dell'intero   albero dei componenti se non esiste   antenato che è un NamingContainer.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top