質問
JSFに問題があります。なぜこれが機能しないのか誰にも言えますか?
<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>
言う:<!> quot;コンポーネントの重複したID instForm:lang <!> quot; 私は同じIDを持つ2つの要素を持っていることを知っていますが、1つは別の要素がレンダリングされていないときにのみレンダリングされます。だから、私はそれが問題になるとは思わなかった。このIDは必要ないので、実際には大きな問題ではありませんが、必要な場合はどうすればいいですか?
解決
問題は、これら2つのコンポーネントがこのページのJSFコンポーネントツリーの一部であるということです。また、同時に表示できない場合でも、同じIDを共有します。これはJSFで許可されていません。
問題を解決するための3つの解決策があります:
最初の解決策: 2つの異なるIDを定義する
2番目の解決策: Wayne Youngが説明したように、NamingContainerを使用できます。NamingContainerは、IDの前にNamingContainerのIDを付加します。
3番目の解決策: 1つの<h:selectOneListbox/>
のみを使用し、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>
Javaコード:
public List<SelectItem> getLanguage() {
if (isView()) {
return getLanguagesByInstitute();
} else {
return getAvailableLanguages();
}
}
public void changeLanguage(ValueChangeEvent evt) {
if (!isView()) {
return;
}
...
}
他のヒント
別のIDを使用するか、別の名前付けコンテナーに配置する必要があります。
UIComponent.setId()のJavadocのコメント:
指定された識別子は すべてのコンポーネント間で一意 (ファセットを含む) 最も近い先祖の子孫 NamingContainerであるUIComponent または全体の範囲内 そのようなものがない場合のコンポーネントツリー NamingContainerである祖先。