4

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>

「コンポーネントinstForm:langのIDが重複しています」同じIDを持つ要素が2つあることはわかっていますが、一方はそうでない場合にのみレンダリングされます。だから、問題になるとは思いませんでした。このIDは必要ないので、実際には大きな問題ではありませんが、必要な場合はどうすればよいですか?

4

2 に答える 2

11

問題は、これら2つのコンポーネントがこのページのJSFコンポーネントツリーの一部であるということです。また、同時に表示できない場合でも、JSFでは許可されていない同じIDを共有します。

私はあなたの問題を解決するための3つの解決策を見ています:

最初の解決策: 2つの異なるIDを定義する

2番目の解決策: Wayne Youngが説明したように、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;
    }
    ...
}
于 2009-09-16T06:30:18.033 に答える
1

別のIDを使用するか、別のネーミングコンテナに入れる必要があります。

UIComponent.setId()のJavadocは次のように述べています。

指定する識別子は、NamingContainerである最も近い祖先UIComponentの子孫であるすべてのコンポーネント(ファセットを含む)間で一意である必要があります。NamingContainerであるそのような祖先がない場合は、コンポーネントツリー全体のスコープ内である必要があります。

于 2009-09-15T23:22:44.557 に答える