【问题标题】:Duplicate Id. JSF重复 ID。 JSF
【发布时间】:2009-09-15 16:46:43
【问题描述】:

我对 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,但是如果我需要那我该怎么办?

【问题讨论】:

    标签: jsf ajax4jsf


    【解决方案1】:

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

    我看到了三种解决方案来解决您的问题:

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

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

    第三种解决方案:只使用一个&lt;h:selectOneListbox/&gt;,然后在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;
        }
        ...
    }
    

    【讨论】:

    • 谢谢!这正是我想要的(第三个解决方案)。它是如此简单,以至于我很困惑,我自己找不到它。 :)
    • 命名容器呢?我不明白,问题交叉发帖stackoverflow.com/questions/3449370/… 并不能解释我眼中的好东西
    【解决方案2】:

    您必须使用不同的 ID 或将其放入另一个命名容器中。

    Javadoc for UIComponent.setId() 说:

    指定的标识符必须是 在所有组件中独一无二 (包括方面)是 最近祖先的后代 UIComponent 是一个 NamingContainer, 或在整个范围内 如果没有这样的组件树 是 NamingContainer 的祖先。

    【讨论】:

      猜你喜欢
      • 2012-04-11
      • 1970-01-01
      • 2016-11-18
      • 1970-01-01
      • 2013-05-29
      • 2011-06-04
      • 2015-01-06
      • 1970-01-01
      • 2015-02-16
      相关资源
      最近更新 更多