2010-01-08 8 views
6

मैं दीवार के खिलाफ अपने सिर को टक्कर लगी हूं, जो मुझे लगता है कि Grails में हल करने के लिए एक बहुत ही सरल समस्या होगी:Grails - SortedSet या तुलनात्मक मॉडल के बिना सूची आउटपुट छंटनी?

कहें कि मेरे पास शॉपिंग-कार्ट-जैसे मॉडल है; इसलिए एक क्लास कार्ट जिसमें कई आइटम हैं, और प्रत्येक आइटम कार्ट के लिए है। आम तौर पर, मुझे गाड़ी में वस्तुओं के आदेश की परवाह नहीं है - मुझे परवाह नहीं है कि वे किस क्रम में संग्रहीत हैं, गणना की गई है, आदि। फिर भी, मैं उन्हें उसी क्रम में प्रदर्शित करना चाहता हूं। ऐसा लगता है कि यह तर्क दृश्य परत में पूरी तरह से अस्तित्व में सक्षम होना चाहिए, लेकिन एकमात्र समाधान जो मुझे ढूंढने में सक्षम है, मुझे मॉडल परत में सॉर्टेडसेट के रूप में आइटम घोषित करने के लिए कहता है। यह मेरी कंट्रोलर परत को भी प्रभावित करता है, जैसे कि सरल सूची संचालन जैसे कि .collect {} को टाइप रूपांतरणों को सही रखने और मेरे सॉर्टिंग को संरक्षित रखने के लिए अब अतिरिक्त सिंटैक्टिक कूदना आवश्यक है।

मेरे लिए, यह पागल है, इसलिए मुझे कुछ आसान याद आना चाहिए! उदाहरण के लिए, <g:each in="${cart.items.sort{it.name}}"> या कुछ ऐसा कुछ करने के लिए कोई तरीका है, ताकि मैं केवल आउटपुट/व्यू परत पर एक सतत प्रदर्शन ऑर्डर लागू कर सकूं? संपादित करें - नीचे मैट का जवाब देखें; इसका एक संस्करण वास्तव में काम करता है।

किसी सलाह या पॉइंटर्स के लिए धन्यवाद!

उत्तर

4

This 3rd party tag ऐसा लगता है कि आपको वह चाहिए जो आपको चाहिए। यदि नहीं, तो आप हमेशा अपना टैग बना सकते हैं।

<sort:sort items="someCollection" sorter="${someComparatorClosure}"/> 

संग्रह someCollection से जाना जाता हो जाएगा: टैग वर्ग इस

class SortTagLib { 

    static namespace = 'sort' 

    def sort = { attrs -> 

     // A closure that does the sorting can be passed as an attribute to the tag. 
     // If it is not provided the default sort order is used instead 
     def sorter = attrs.sorter ?: {item1, item2 -> item1 <=> item2} 
     sorter = sorter as Comparator   

     // The collection to be sorted should be passed into the tag as a parameter 
     Collections.sort(attrs.items, sorter) 
    } 
} 

इस टैग को तो इस तरह उनके नाम संपत्ति से वस्तुओं का संग्रह सॉर्ट करने के लिए इस्तेमाल किया जा सकता है जैसे छँटाई कर सकता है जब टैग निष्पादित किया जाता है तो जगह में क्रमबद्ध किया जाता है।

+0

यह बढ़िया है। मैं अंततः एक प्रॉक्सी जेनरेटर और तुलनात्मक इंटरफेस का उपयोग कर एक ही लाइन के साथ एक ही समाधान पर ठोकर खाई, लेकिन आपका बहुत साफ है, और निश्चित रूप से जिस तरह का समाधान मैं ढूंढ रहा था। धन्यवाद! – bprotas

22

तुम भी संग्रह के लिए उपलब्ध प्रकार तरीकों का उपयोग कर सकते हैं/मैप्स यहां परिभाषित: http://groovy.codehaus.org/api/org/codehaus/groovy/runtime/DefaultGroovyMethods.html

मैं व्यक्तिगत रूप से मेरे जीएसपी में एक <g:each/> टैग के साथ यह काफी आसान संयोजन के रूप में यह करने के लिए मिल गया है:

<!-- Books sorted by title --> 
<g:each in="${ books.sort{a,b-> a.title.compareTo(b.title)} }"> 
    <p>Title: ${it.title}</p> 
    <p>Author: ${it.author}</p> 
</g:each> 

संग्रह और मानचित्र में हेरफेर करने के तरीके के लिए, मैं क्रमशः this page और this page की अनुशंसा करता हूं।

+0

धन्यवाद मैट ... आपका समाधान भी काम करता है, और यह भी बहुत साफ है, हालांकि मैं यह सोच सकता था कि मैंने पहले यह कोशिश की थी और यह असफल रहा ... मेरा दिमाग गंदा हो गया होगा। धन्यवाद! – bprotas

+0

सुंदर! इसे प्रेम करें! +1 – Eldelshell

+0

धन्यवाद मैट वास्तव में अच्छी तरह से काम करता है – Vahid

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