2012-01-05 16 views
17

मैंने resources प्लग-इन को एक grails 1.3.7 एप्लिकेशन में जोड़ा और सबकुछ ठीक से काम करता है जो जावास्क्रिप्ट को अतुल्यकालिक रूप से लोड किया गया है।Grails संसाधन प्लगइन और AJAX लोड जावास्क्रिप्ट

तो अगर मुझे लगता है कि एक

<r:script> 
    // javascript here 
</r:script> 

होता है और ajax js कोड निष्पादित नहीं करता है के माध्यम से इसे लोड एक टेम्पलेट है, और मैं इस त्रुटि मिलती है:

It looks like you are missing some calls to the r:layoutResources tag

जो भावना क्योंकि बनाता है पृष्ठ पहले से ही प्रस्तुत किया जा चुका है और कोई आर नहीं है: लेआउट स्रोत नए जोड़े आर: स्क्रिप्ट जेएस कोड को संभालने के लिए।

केवल वैकल्पिक हल मैंने पाया वास्तविक render(template:...) नियंत्रक क्रियाएँ सामग्री एसिंक्रोनस रूप से प्रस्तुत करना में के बाद render r.layoutResources(disposition:"defer")जोड़ना है।

क्या कोई अन्य स्पष्ट समाधान है?

उत्तर

18

एक बेहतर दृष्टिकोण आपके AJAX प्रतिक्रिया के लिए एक समर्पित लेआउट के लिए होगा:

<g:layoutBody/> 
<r:layoutResources disposition="defer"/> 

आप Grails 2.0 का उपयोग कर रहे हैं, तो आप विधि प्रस्तुत करना (render template: "...", layout: "ajax") में लेआउट निर्दिष्ट कर सकते हैं। अन्यथा, सम्मेलन द्वारा लेआउट का उपयोग करें।

+0

बहुत उपयोगी जानकारी! मैंने पहले से ही [डॉक्स] (http://grails.org/doc/latest/ref/Tags/render.html) में ऐसा कुछ देखा था, लेकिन रेंडर टैग में 2.0 के रूप में कोई "लेआउट" विशेषता नहीं है। 3। –

+0

+1 मेरे लिए भी बहुत उपयोगी है। –

+0

हाँ, यह काम कर रहा है – confile

4

एक बेहतर विकल्प मुझे लगता है कि आपके टेम्पलेट खंड में आर: स्क्रिप्ट का उपयोग नहीं करना है। बस सामान्य स्क्रिप्ट टैग का प्रयोग करें। यदि आपको लेआउट स्रोतों की आवश्यकता नहीं है तो आपको इन टुकड़ों के अंदर संसाधनों से कोई लाभ नहीं मिल रहा है।

कभी-कभी क्लासिक तरीका सबसे अच्छा होता है।

+2

यदि मैं क्लासिक स्क्रिप्ट टैग का उपयोग करता हूं, प्रारंभिक पृष्ठ लोड में जेएस कोड निष्पादित नहीं होगा क्योंकि यह पृष्ठ के नीचे लोड किए गए पुस्तकालयों (jQuery आदि) पर निर्भर करता है (और मैं उन्हें लोड नहीं करना चाहता सिर)। – sikrip

+1

jQuery सामान्य रूप से सिर स्वभाव में होना चाहिए और वैसे भी पहले निष्पादित करना चाहिए।यहां आपके सभी समाधान बहुत हैकी होने जा रहे हैं क्योंकि आप प्रभावी रूप से गतिशील स्क्रिप्ट टुकड़े लौट रहे हैं, जो संसाधनों के लिए डिज़ाइन नहीं किया गया है। ऐसा लगता है कि यह दृष्टिकोण आपको कुछ समस्याएं पैदा कर रहा है, लेकिन यदि आप इसके साथ जारी रखना चाहते हैं तो मैं सुझाव दूंगा कि आप मुख्य जीएसपी में संसाधन टैग का उपयोग न करें जो पहले परोसा जाता है। –

1

मैं हमेशा पीटर लेडब्रुक प्रतिक्रिया के साथ जाता हूं, लेकिन लेआउट का उपयोग करने के बजाय, मैं एक टेम्पलेट का उपयोग करता हूं और मैं मुख्य लेआउट में प्रस्तुत करने के लिए स्वचालित करता हूं।

<!DOCTYPE html> 
<g:if test="${request.xhr}"> 
    <g:render template="/layouts/content" /> 
</g:if> 
<g:else> 
    <html> 
    ... <!-- Main layout stuff: application resources, logo, main menu, etc --> 
    <div id="content"> <!-- Somewhere in the body --> 
      <g:render template="/layouts/content" /> 
     </div> 
    </html> 
</g:else> 

फिर, _content.gsp टेम्पलेट लगता है:

<g:layoutBody /> 
<r:layoutResources disposition="defer"/> 
<!-- Ajaxify your relative links with the framework of your choice --> 

इस तरह, मैं अपने आप ajaxify सभी संबंधित लिंक्स और रूपों और कोई कार्रवाई नहीं की आवश्यकता होती है सकते हैं मेरे main.gsp की तरह लग रहा है निम्नलिखित नियंत्रक में (कोई अलग प्रतिक्रिया नहीं), क्योंकि AJAX प्रतिक्रिया हमेशा सामग्री div के अंदर जाती है।

+0

बीटीडब्लू मैं आम तौर पर सभी रिश्तेदार लिंक को अजाधित करने के लिए अपने स्वयं के AJAXify फ़ंक्शन के साथ जाता हूं ... बस किसी के इच्छुक होने पर: https://github.com/deigote/ajaxify/ – Deigote

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