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