2011-11-15 3 views
6

JSF에서 아약스에 대해 의심하고 있습니다.malformedXML : 업데이트 중 : adminUsersForm을 찾을 수 없습니다.

내 XHTML은 다음과 같습니다

<h:body> 
<h:form id="menuForm"> 
    <h:outputLabel for="menu">Available actions: </h:outputLabel> 
    <h:selectOneMenu id="menu" value="#{menu.mainMenuItem}"> 
     <f:selectItem itemLabel="Select an option..." itemValue="null" /> 
     <f:selectItems value="#{menu.mainMenuItems}" /> 
     <f:ajax render=":menuForm :adminUsersForm :loadInfoForm :viewFilesForm" /> 
     <!-- <f:ajax render="@all" /> --> 
    </h:selectOneMenu> 
</h:form> 

<h:form id="adminUsersForm" 
    rendered="#{menu.mainMenuItem == 'Admin users.'}"> 
    <h:commandButton value="Button 1" /> 
</h:form> 

<h:form id="loadInfoForm" 
    rendered="#{menu.mainMenuItem == 'Load info.'}"> 
    <h:commandButton value="Button 2" /> 
</h:form> 

<h:form id="viewFilesForm" 
    rendered="#{menu.mainMenuItem == 'View files.'}"> 
    <h:commandButton value="Button 3" /> 
</h:form> 
</h:body> 

내가 <f:ajax render=":menuForm :adminUsersForm :loadInfoForm :viewFilesForm" />을 사용하면 내가 올바른 <h:form> 렌더링됩니다 <f:ajax render="@all" />를 사용할 때 내가 다른 한편으로는 malformedXML의 오류가 발생합니다.

여기에 무슨 일이 일어나고 있습니까? 우리는 컴포넌트를 렌더링 할 수있는 ajax를 사용하여 을 같은 양식으로 렌더링 할 수 있지만 :componentID을 사용하면 ajax- 컴포넌트를 폼 외부에서 렌더링 할 수 있다는 것을 알았습니다.

미리 감사드립니다. 어쩌면 기본 질문이지만 JSF에 익숙하지 않고 배우려고 노력하고 있습니다.

답변

13

<f:ajax render>은 클라이언트 ID가 이고 항상 인 JSF 생성 HTML DOM 트리를 가리켜 야합니다. 이는 HTML DOM 트리를 업데이트해야하는 클라이언트 측 JavaScript이기 때문에 필수입니다. 그러나 클라이언트 ID가 이 아닌이 JSF에 의해 렌더링되지 않았으므로 HTML DOM 트리에 있음을 나타냅니다.

rendered 특성을 가진 요소를 부모 구성 요소에 넣어야합니다.이 구성 요소는 인데, 항상이 JSF 생성 HTML DOM 트리에 있습니다. 여기

하나의 방법입니다 : 여기
<h:form id="menuForm"> 
    <h:outputLabel for="menu">Available actions: </h:outputLabel> 
    <h:selectOneMenu id="menu" value="#{menu.mainMenuItem}"> 
     <f:selectItem itemLabel="Select an option..." itemValue="null" /> 
     <f:selectItems value="#{menu.mainMenuItems}" /> 
     <f:ajax render=":menuForm :adminUsers :loadInfo :viewFiles :adminUsersForm :loadInfoForm :viewFilesForm" /> 
    </h:selectOneMenu> 
</h:form> 

<h:panelGroup id="adminUsers"> 
    <h:form id="adminUsersForm" rendered="#{menu.mainMenuItem == 'Admin users.'}"> 
     <h:commandButton value="Button 1" /> 
    </h:form> 
</h:panelGroup> 

<h:panelGroup id="loadInfo"> 
    <h:form id="loadInfoForm" rendered="#{menu.mainMenuItem == 'Load info.'}"> 
     <h:commandButton value="Button 2" /> 
    </h:form> 
</h:panelGroup> 

<h:panelGroup id="viewFiles"> 
    <h:form id="viewFilesForm" rendered="#{menu.mainMenuItem == 'View files.'}"> 
     <h:commandButton value="Button 3" /> 
    </h:form> 
</h:panelGroup> 

다른 방법입니다 (만약 거기에 더 좋습니다 실제로 아니오로 - - 업데이트 양식 사이에 내용을) :

<h:form id="menuForm"> 
    <h:outputLabel for="menu">Available actions: </h:outputLabel> 
    <h:selectOneMenu id="menu" value="#{menu.mainMenuItem}"> 
     <f:selectItem itemLabel="Select an option..." itemValue="null" /> 
     <f:selectItems value="#{menu.mainMenuItems}" /> 
     <f:ajax render=":menuForm :otherForms :adminUsersForm :loadInfoForm :viewFilesForm" /> 
    </h:selectOneMenu> 
</h:form> 

<h:panelGroup id="otherForms"> 
    <h:form id="adminUsersForm" rendered="#{menu.mainMenuItem == 'Admin users.'}"> 
     <h:commandButton value="Button 1" /> 
    </h:form> 

    <h:form id="loadInfoForm" rendered="#{menu.mainMenuItem == 'Load info.'}"> 
     <h:commandButton value="Button 2" /> 
    </h:form> 

    <h:form id="viewFilesForm" rendered="#{menu.mainMenuItem == 'View files.'}"> 
     <h:commandButton value="Button 3" /> 
    </h:form> 
</h:panelGroup> 

주에 그 나는 다른 모든 형태의 ID를 render에 포함 시켰습니다. 이것은 JSF Ajax JavaScript (JSF 2.2에서 수정 예정)의 버그를 해결하는 방법입니다. 자세한 설명은 Ajax rendering of content which contains another form을 참조하십시오.

+1

좋습니다. ''과''?? 두 번째 옵션은 항상 상위 구성 요소가없는 경우에도 작동했기 때문입니다. 단지 명확한 개념을 원합니다. 고맙습니다 – BRabbit27

+2

주요 차이점은 전송 된 데이터입니다. 양식 외부에 많은 다른 내용이있는 경우'@ all '은 불필요한 데이터를 전송하므로 응답 크기가 커져서 속도가 느려집니다. 또한,'@ all'은 답안의 마지막 단락에서 설명한 것과 같은 문제가 있습니다. 여러분은 여전히'render'에서 형식 ID를 명시 적으로 지정할 필요가 있습니다. – BalusC

+0

@BalusC이 답변을 주셔서 감사합니다, 나는 그 문제가 무엇인지 이해했습니다. –

관련 문제