문제

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의 후손 인 모든 구성 요소 (면 포함) 또는 전체 구성 요소 트리의 범위 내에있는 모든 구성 요소 중 고유해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top