2009-09-15 48 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的 祖先。