Pergunta

Eu tenho um problema com JSF. Alguém pode dizer por que isso não 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>

Ele diz: "duplicar Id para uma instForm componente: lang" Eu sei que eu tenho 2 elementos com o mesmo Id, mas um é processado somente quando outro não é. Então, eu não acho que seria um problema. Na verdade, não é um grande problema em tudo como eu não preciso disso id, mas o que se eu precisava então o que eu faço?

Foi útil?

Solução

Seu problema é que esses dois componentes são parte da árvore JSF componente para esta página. E mesmo se eles não podem ser exibidos ao mesmo tempo, eles compartilham o mesmo ID, o que não é permitido pelo JSF.

Eu vejo três soluções para resolver o problema:

Primeira solução: Definir dois diferentes ID

Segunda solução:. Você pode, como explicado por Wayne Young, usar um NamingContainer, que irá anteceder a sua ID pelo ID do NamingContainer

Terceiro solução:. Use apenas um <h:selectOneListbox/> e, em seguida, fazer a diferença no 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;
    }
    ...
}

Outras dicas

Você vai ter que usar um ID diferente ou colocá-lo em outro contêiner de nomeação.

O Javadoc para UIComponent.setId () diz:

A especificado identificador deve ser único entre todos os componentes (Incluindo facetas) que são descendentes do ancestral mais próximo UIComponent que é um NamingContainer, ou no âmbito do todo árvore de componentes, se não existe ancestral que é um NamingContainer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top