2011-11-15 30 views
6

Tôi đang có một số nghi ngờ về ajax trên JSF.malformedXML: Trong khi cập nhật: adminUsersForm không tìm thấy

xhtml của tôi trông như thế này:

<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> 

Khi tôi sử dụng <f:ajax render=":menuForm :adminUsersForm :loadInfoForm :viewFilesForm" /> tôi nhận được lỗi malformedXML, mặt khác khi tôi sử dụng <f:ajax render="@all" /> đúng <h:form> rendering.

Có gì xảy ra ở đây? Tôi đọc rằng bằng cách sử dụng ajax, chúng tôi có thể hiển thị các thành phần chỉ bên trong cùng một hình thức , nhưng nếu chúng tôi sử dụng :componentID thì có thể kết xuất lại thành phần ajax- bên ngoài biểu mẫu.

Cảm ơn trước và có thể đó là câu hỏi cơ bản nhưng tôi rất mới với JSF và cố gắng tìm hiểu.

Trả lời

13

<f:ajax render> phải trỏ đến ID khách hàng là luôn là hiện diện trong cây HTML DOM do JSF tạo. Điều này là bắt buộc vì đó là JavaScript ở phía máy khách cần cập nhật cây DOM HTML. Tuy nhiên, bạn đang trỏ nó tới các ID khách hàng là không phải là có trong cây DOM HTML vì chúng không được JSF trả về.

Bạn cần đặt các phần tử đó với thuộc tính rendered trong thành phần gốc là luôn có mặt trong cây HTML DOM do JSF tạo.

Dưới đây là một cách:

<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> 

Dưới đây là một cách khác (mà tôi khuyên bạn hơn nếu có thực sự không có to-be-cập nhật nội dung giữa các hình thức):

<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> 

Lưu ý rằng trong cả hai cách tôi đã bao gồm các ID của tất cả các biểu mẫu khác trong số render. Đây là cách giải quyết một lỗi trong JavaScript JSF Ajax (được sửa trong JSF 2.2). Để có giải thích chi tiết, xem thêm Ajax rendering of content which contains another form.

+1

Ok, đã hiểu. Có quá nhiều sự khác biệt giữa '' và '' ?? Vì tùy chọn thứ hai hoạt động ngay cả khi không có thành phần cha mẹ nào luôn hiển thị. Chỉ muốn có khái niệm rõ ràng. THanks – BRabbit27

+2

Sự khác biệt chính là trong dữ liệu được chuyển. Nếu bạn có nhiều nội dung khác bên ngoài các biểu mẫu, thì '@ all' sẽ chuyển dữ liệu không cần thiết làm cho kích thước phản hồi lớn hơn, do đó làm cho nó chậm hơn. Ngoài ra, '@ all' có cùng một vấn đề như được mô tả trong đoạn cuối của câu trả lời, bạn vẫn cần xác định rõ ràng các ID biểu mẫu trong' render'. – BalusC

+0

@BalusC Cảm ơn câu trả lời này, tôi đã hiểu vấn đề là gì. –

Các vấn đề liên quan