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” 我知道我有 2 个具有相同 Id 的元素,但只有当另一个元素不是时才会呈现一个。所以,我不认为这会是一个问题。实际上这根本不是什么大问题,因为我不需要这个 id,但是如果我需要,那我该怎么办?

4

2 回答 2

11

您的问题是这两个组件是此页面的 JSF 组件树的一部分。并且即使它们不能同时显示,它们也共享相同的 ID,这是 JSF 不允许的。

我看到三种解决方案可以解决您的问题:

第一个解决方案:定义两个不同的 ID

第二种解决方案:正如 Wayne Young 所解释的,您可以使用 NamingContainer,它将在其 ID 前面加上 NamingContainer 的 ID。

第三种解决方案:只使用一个<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 回答