2013-11-25 6 views
12

मेरे Grails एप्लिकेशन में मेरे पास काफी बड़े मानदंड बंद हैं, और मैं अपने आवेदन में कई स्थानों पर इसका हिस्सा पुन: उपयोग करना चाहता हूं। अनुभाग को डुप्लिकेट करने के बजाय मुझे पुन: उपयोग करने की आवश्यकता है, मैं इसे एक अलग बंद करने के रूप में परिभाषित करना चाहता हूं और इसकी आवश्यकता होने पर इसे संदर्भित करना चाहता हूं, लेकिन मैं वाक्यविन्यास के साथ थोड़ा सा संघर्ष कर रहा हूं।Grails मानदंड बंद करने का हिस्सा पुन: उपयोग करना

यह एक सरल/संस्करण में कटौती है, लेकिन अनिवार्य रूप से मेरी मापदंड इस तरह दिखता है:

def criteriaClosure = { 
    and { 
     // filtering criteria that I'd like to reuse in lots of places 
     or { 
      names.each { name -> 
       sqlRestriction(getFilteringSql(name), [someId]) 
      } 
     } 

     if (isOrganisationChild(childDefaultGrailsDomainClass)) { 
      sqlRestriction(getFilteringSql(domain), [someArg]) 
     } 

     // filtering criteria that's specific to this particular method 
     sqlRestriction(getSomeOtherSql(), [someOtherArg]) 
    } 
} 

def criteria = domain.createCriteria() 
def paginatedList = criteria.list([offset: offset, max: max], criteriaClosure) 

मैं बंद मैं एक चर के रूप में पुन: उपयोग करना चाहते हैं के हिस्से को परिभाषित करने की कोशिश की है, और यह संदर्भित मेरे मानदंड बंद होने पर, हालांकि इसे परिभाषित प्रतिबंध लागू नहीं होते हैं।

def reusableClosure = { 
    and { 
     or { 
      names.each { name -> 
       sqlRestriction(getFilteringSql(name), [someId]) 
      } 
     } 

     if (isOrganisationChild(childDefaultGrailsDomainClass)) { 
      sqlRestriction(getFilteringSql(domain), [someArg]) 
     } 
    } 
} 

def criteriaClosure = { 
    and { 
     reusableClosure() //this doesn't seem to work 
     sqlRestriction(getSomeOtherSql(), [someOtherArg]) 
    } 
} 

मुझे यकीन है कि यह करने के लिए यह एक बहुत सी सरल बात होनी चाहिए, इसलिए क्षमा करें यदि यह एक कठिन सवाल है। कोई विचार?

उत्तर

13

मुझे लगता है कि आप reusableClosure करने के लिए नीचे प्रतिनिधि पारित करने के लिए है, अर्थात्:

def criteriaClosure = { 
    and { 
     reusableClosure.delegate = delegate 
     reusableClosure() 
     sqlRestriction(getSomeOtherSql(), [someOtherArg]) 
    } 
} 
+0

यही काम किया, धन्यवाद। - आकस्मिक रूप से, 'reusableClosure' के बाद कोष्ठक क्यों आवश्यक हैं? – rcgeorge23

+1

कूल :-) क्योंकि यह बंद करने को कॉल करता है (जो 'और' ब्लॉक को मानदंड में लौटाता है) –

+0

काम करता है, बहुत बहुत धन्यवाद! – Aston

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