2009-11-22 15 views
17

मैं एक grails सेवा में g.render का उपयोग करने की कोशिश कर रहा हूँ, लेकिन ऐसा लगता है कि जी डिफ़ॉल्ट रूप से सेवाओं को प्रदान नहीं किया जाता है। क्या सेवा में एक दृश्य प्रस्तुत करने के लिए टेम्पलेट इंजन प्राप्त करने का कोई तरीका है? मैं इस बारे में गलत तरीके से जा रहा हूं। जो मैं देख रहा हूं वह आंशिक टेम्पलेट से स्ट्रिंग में दृश्य प्रस्तुत करता है, और परिणामस्वरूप स्ट्रिंग को जेएसओएन प्रतिक्रिया के हिस्से के रूप में AJAX अपडेट के साथ उपयोग करने के लिए भेजता है।एक grails सेवा में g.render का उपयोग

किसी भी विचार?

+0

किसी भी खोजने वालों को इन कई साल बाद यह पेज लो भर में घूमते हैं, मत भूलना के लिए है कि एक सेवा साधन से एक टेम्पलेट प्रतिपादन कि टेम्पलेट में एक ही संदर्भ नहीं होगा जो नियंत्रक से प्रदान किए जाने पर होगा; इसलिए, यदि आप उपयोग कर रहे हैं, उदाहरण के लिए, जीएसपी में 'createLink', तो आपको' नियंत्रक 'के साथ-साथ' action' निर्दिष्ट करना होगा! –

उत्तर

27

मैं पूरी तरह से जॉन के तर्क से सहमत हूं - सेवाओं में जीएसपी करना आम तौर पर एक खराब डिजाइन निर्णय है। लेकिन अपवादों के बिना कोई नियम नहीं! gspTagLibraryLookup सेम कर सकते हैं पाठ्यक्रम के लिए उपयोग की एक सेवा में हर दूसरे वांछित taglib का उपयोग करके आप

class MyService implements InitializingBean { 
    boolean transactional = false 
    def gspTagLibraryLookup // being automatically injected by spring 
    def g 

    public void afterPropertiesSet() { 
     g = gspTagLibraryLookup.lookupNamespaceDispatcher("g") 
     assert g 
    } 

    def serviceMethod() {  
     // do anything with e.g. g.render 
    } 
} 

: तुम अब भी ऐसा करना चाहते हैं, तो निम्न तरीके का प्रयास करें।

+0

बड़ी ज़िम्मेदारी आता है! इस तरह की चीजें करते समय सावधान रहें - सुनिश्चित करें कि आप इसे करने से पहले किसी सेवा में जीएसपी को प्रतिपादित करने के पीछे तर्क जानते हैं :) – Chii

+0

मेरा इरादा टेम्पलेट प्रस्तुत करना था और फिर जेएसओएन के साथ वापस आना था ताकि परिणामी एचटीएमएल डाला जा सके। मैं एक सेवा में तर्क को समाहित करने जा रहा था, लेकिन पाया कि प्रत्येक नियंत्रक में मैन्युअल रूप से JSON को मैन्युअल रूप से वापस करना भी काम करता है, और g.render पहले से ही उपलब्ध है। सहयोग के लिए आप सभी का धन्यवाद। – aasukisuki

+0

इसमें एक और समस्या है ... यदि वे नियंत्रक पर निर्भर करते हैं तो सेवाओं के लिए यूनिट परीक्षण बनाना कठिन होता है। – luiscolorado

4

मेरी सलाह नियंत्रक में ऐसा करने के लिए होगी। सेवा को पुन: प्रयोज्य तर्क होना चाहिए और दृश्य टेम्पलेट पर निर्भर नहीं होना चाहिए, उस काम को नियंत्रक को छोड़ दें। टेम्पलेट को पास करने के लिए आवश्यक डेटा प्राप्त करने के लिए सेवा का उपयोग करें, लेकिन नियंत्रक को टेम्पलेट के साथ बातचीत करने का काम छोड़ दें।

+1

क्षमा करें, लेकिन अगर आपका उत्तर अच्छी सलाह है, तो यह स्वीकार्य उत्तर नहीं है: क्या पूछा गया था, हासिल करने के तरीके भी हैं, भले ही अनुशंसित न हो। महान शक्ति के साथ – Guillaume

3

यहाँ एक समाधान Stefan's के समान है कि है, लेकिन थोड़ा सरल

import org.codehaus.groovy.grails.plugins.web.taglib.ApplicationTagLib 
import org.springframework.context.ApplicationContext 
import org.springframework.context.ApplicationContextAware 

class MyService implements ApplicationContextAware { 

    private ApplicationTagLib g 

    void setApplicationContext(ApplicationContext applicationContext) { 
     g = applicationContext.getBean(ApplicationTagLib) 

     // now you have a reference to g that you can call render() on 
    } 
} 
13

यह और भी आसान अब Grails 2 में PageRenderer साथ है। उदाहरण के लिए:

class SomeService { 
    def groovyPageRenderer 

    void someMethod() { 
     String html = groovyPageRenderer.render(view: '/email/someTemplateName') 
    } 
} 

एपीआई - http://grails.org/doc/latest/api/grails/gsp/PageRenderer.html

अधिक पूर्ण उदाहरण - http://mrhaki.blogspot.com/2012/03/grails-goodness-render-gsp-views-and.html

+0

लगभग आपके उत्तर को याद किया, इसे जोड़ने के लिए धन्यवाद। नए Grails – moeTi

+0

के साथ अब चिकनी लग रहा है आसान और सरल। लेकिन [स्टीफन] (http://stackoverflow.com/questions/1777640/using-g-render-in-a-grails-service/1778991#1778991) किसी भी टैग के लिए उत्तर प्रस्ताव समाधान। धन्यवाद ;) – IgniteCoders

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