Pregunta

Tengo un problema con JSF.Nadie puede decir por qué no funciona?

<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 duplicados para un componente instForm:lang" Sé que tengo 2 elementos con el mismo Id, pero uno se presenta sólo cuando el otro no lo es.Así que, pensé que no sería un problema.En realidad no es un gran problema en absoluto, ya que no necesito este id, pero lo que si me necesita, a continuación, ¿qué haría yo?

¿Fue útil?

Solución

El problema es que estos dos componentes son parte de la JSF árbol de Componentes para esta página.E incluso si no pueden mostrarse al mismo tiempo, comparten el mismo ID, lo cual no está permitido por el JSF.

Veo tres soluciones para resolver el problema:

Primera solución: Definir dos diferentes ID

Segunda solución: Usted puede, como se ha explicado por Wayne Jóvenes, el uso de un NamingContainer, que el prefijo de su IDENTIFICACIÓN por el IDENTIFICADOR de la NamingContainer.

Tercera solución: El uso de sólo uno <h:selectOneListbox/> y, a continuación, hacer la diferencia en el código 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>

Código Java:

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

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

Otros consejos

Tendrá que usar una ID diferente o ponerla en otro contenedor de nombres.

El Javadoc para UIComponent.setId () dice:

  

El identificador especificado debe ser   único entre todos los componentes   (incluidas las facetas) que son   descendientes del antepasado más cercano   UIComponent que es un NamingContainer,   o dentro del alcance de la totalidad   árbol de componentes si no existe   ancestro que es un NamingContainer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top