2011-11-15 12 views
6

मुझे जेएसएफ पर AJAX के बारे में कुछ संदेह हैं।malformedXML: अद्यतन के दौरान: adminUsersForm नहीं मिला

मेरे एक्सएचटीएमएल इस तरह दिखता है:

<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" /> का उपयोग जब मैं <f:ajax render="@all" /> सही <h:form> प्रतिपादन का इस्तेमाल मैं malformedXML त्रुटि मिलती है, दूसरे हाथ पर।

यहां क्या हो रहा है? मैंने पढ़ा है कि AJAX का उपयोग करके हम केवल फॉर्म के अंदर घटक प्रस्तुत कर सकते हैं, लेकिन यदि हम :componentID का उपयोग करते हैं तो यह फ़ॉर्म के बाहर AJAX- घटक को प्रस्तुत करना संभव है।

अग्रिम धन्यवाद, और शायद यह एक बुनियादी सवाल है लेकिन मैं जेएसएफ के लिए बहुत नया हूं और सीखने की कोशिश कर रहा हूं।

उत्तर

13

<f:ajax render> ग्राहक आईडी जो हमेशा JSF जेनरेट किया गया HTML डोम पेड़ में मौजूद है इंगित करना चाहिए। यह अनिवार्य है क्योंकि यह क्लाइंट पक्ष में जावास्क्रिप्ट है जिसे HTML DOM पेड़ को अपडेट करने की आवश्यकता है। हालांकि, आप इसे क्लाइंट आईडी पर इंगित कर रहे हैं जो HTML DOM पेड़ में मौजूद नहीं हैं क्योंकि उन्हें जेएसएफ द्वारा प्रस्तुत नहीं किया गया है।

आप किसी अभिभावक घटक है जो हमेशा JSF जेनरेट किया गया HTML डोम पेड़ में मौजूद है में एक rendered विशेषता के साथ उन तत्वों डाल करने के लिए की जरूरत है।

यहाँ एक तरीका है:

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

नोट में है कि दोनों तरीकों से मैंने render में अन्य सभी रूपों की आईडी भी शामिल की है। यह जेएसएफ अजाक्स जावास्क्रिप्ट में एक बग को काम करने के लिए है (जिसे जेएसएफ 2.2 में तय किया जाना है)। विस्तृत स्पष्टीकरण के लिए, Ajax rendering of content which contains another form भी देखें।

+1

ठीक है, समझ गया। ' 'और' '?? क्योंकि दूसरा विकल्प तब भी काम करता था जब कोई मूल घटक हमेशा उपस्थित नहीं होता था। बस स्पष्ट अवधारणाएं चाहते हैं। धन्यवाद – BRabbit27

+2

स्थानांतरित डेटा में प्रमुख अंतर है। यदि आपके पास फॉर्म के बाहर बहुत सारी सामग्री है, तो '@ all' अनावश्यक डेटा स्थानांतरित करेगा जो प्रतिक्रिया आकार को बड़ा बनाता है जिससे इस प्रकार यह धीमा हो जाता है। साथ ही, उत्तर के अंतिम अनुच्छेद में वर्णित '@ all' में वही समस्या है, आपको अभी भी 'रेंडर' में फॉर्म आईडी निर्दिष्ट करने की आवश्यकता होगी। – BalusC

+0

@ बालससी इस उत्तर के लिए धन्यवाद, मुझे समझ में आया कि समस्या क्या है। –

संबंधित मुद्दे