문제
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 : Lang"은 동일한 ID를 가진 2 개의 요소가 있다는 것을 알고 있지만, 하나는 다른 사람이 아닌 경우에만 렌더링됩니다. 그래서 나는 그것이 문제가 될 것이라고 생각하지 않았습니다. 사실이 ID가 필요하지 않기 때문에 전혀 큰 문제가 아니지만, 필요한 경우 어떻게해야합니까?
해결책
문제는이 두 구성 요소 가이 페이지의 JSF 구성 요소 트리의 일부라는 것입니다. 동시에 표시 할 수 없더라도 JSF가 허용하지 않는 동일한 ID를 공유합니다.
문제를 해결하기위한 세 가지 해결책이 있습니다.
첫 번째 해결책 : 두 개의 다른 ID를 정의합니다
두 번째 해결책 : Wayne Young이 설명한대로 NamingContainer의 ID에 의해 신분증을 접두사로 표시하는 NamingContainer를 사용할 수 있습니다.
세 번째 해결책 : 하나만 사용하십시오 <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>
자바 코드 :
public List<SelectItem> getLanguage() {
if (isView()) {
return getLanguagesByInstitute();
} else {
return getAvailableLanguages();
}
}
public void changeLanguage(ValueChangeEvent evt) {
if (!isView()) {
return;
}
...
}
다른 팁
다른 ID를 사용하거나 다른 명명 컨테이너에 넣어야합니다.
그만큼 uicomponent.setid의 javadoc () 말한다 :
지정된 식별자는 이름 지정 콘텐츠 인 가장 가까운 조상 UICOMPONTE의 후손 인 모든 구성 요소 (면 포함) 또는 전체 구성 요소 트리의 범위 내에있는 모든 구성 요소 중 고유해야합니다.
제휴하지 않습니다 StackOverflow