2009-09-15 43 views
4

我有JSF的问题。任何人都可以说为什么这不起作用?重复ID。 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> 

它说:“重复ID为组件instForm:郎” 我知道,我有2个元素相同的ID,但一个被渲染,只有当另一个是没有的。所以,我不认为这会是一个问题。其实这不是一个大问题,因为我不需要这个ID,但如果我需要,那么我该怎么办?

回答

11

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

我看到三个解决方案来解决你的问题:

解决方案一:定义两个型动物ID

解决方法二:可以,如由韦恩·杨解释说,使用NamingContainer,这将在NamingContainer的ID前加上他们的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; 
    } 
    ... 
} 
+0

谢谢!这正是我想要的(第三种解决方案)。这很简单,我很困惑,我自己找不到它。 :) – mykola 2009-09-16 12:00:25

+0

命名容器呢?我不明白,并问题crosspost http://stackoverflow.com/questions/3449370/jsf-how-to-create-a-naming-container没有解释我眼中的好东西 – Toskan 2011-08-10 15:26:18

1

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

Javadoc for UIComponent.setId()表示:

指定的标识符必须是 唯一所有可在最近的祖先 UIComponent即一个NamingContainer, 或内的 后代组件 (包括刻面)之间整个 组件树的范围,如果没有这样一个NamingContainer的 祖先。