Frage

Ich habe ein Problem mit JSF. Kann mir jemand sagen, warum dies nicht funktioniert?

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

Dort heißt es: "duplicate Id für eine Komponente instForm: lang" Ich weiß, dass ich zwei Elemente mit gleichen Id haben, aber man wird nur gemacht, wenn ein anderer nicht. Also, ich hätte nicht gedacht, wäre es ein Problem sein. Eigentlich ist es kein großes Problem überhaupt, wie ich diese ID nicht benötigen, aber was, wenn ich brauchte dann, was würde ich tun?

War es hilfreich?

Lösung

Ihr Problem ist, dass diese beiden Komponenten sind Bestandteil der JSF-Komponentenbaum für diese Seite sind. Und selbst wenn sie nicht zur gleichen Zeit angezeigt werden, sie die gleiche ID teilen, die nicht von JSF erlaubt ist.

Ich sehe drei Lösungen Ihr Problem zu lösen:

Erste Lösung: Definieren Sie zwei differents ID

Zweite Lösung: Sie können, wie von Wayne Young hat erklärt, verwenden Sie einen NamingContainer, die ihre ID durch die ID des NamingContainer Präfix wird

.

Dritte Lösung:. Verwenden Sie nur eine <h:selectOneListbox/> und dann den Unterschied in dem Java-Code machen

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

Java-Code:

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

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

Andere Tipps

Sie werden eine andere ID oder legen Sie sie in einem anderen Namenscontainer verwenden.

Die Javadoc für UIComponent.setId () sagt:

  

Der angegebene Bezeichner muss sein   einzigartig unter allen Komponenten   (Einschließlich der Facetten), die   Abkömmlinge des nächsten Vorfahren   UIComponent, die ein NamingContainer ist,   oder im Rahmen der gesamten   Komponentenbaum, wenn es nicht so ist   Vorfahren, die ein NamingContainer ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top