2012-01-05 19 views
9

की एक सूची मैं दो डोमेन कक्षाओंचेक बॉक्स

class Contract { 
    String number 
    static hasMany = [statements:Statement] 
} 

class Statement { 
    String code 
    static hasMany = [contracts:Contract] 
} 

मैं सभी बयानों एक चेकबॉक्स प्रत्येक के बगल के साथ मेरी जीएसपी में उपलब्ध दिखाने के लिए, चुनने के लिए जो बयान अनुबंध पर लागू होते हैं उपयोगकर्ता की अनुमति के करना चाहते हैं। तो कुछ इस तरह:

<g:each in="${Statement.list()}" var="statement" status="i"> 
    <g:checkBox name="statements[${i}].id" value="${statement.id}" checked="${contractInstance.statements.contains(statement.id)}" /> 
    <label for="statements[${i}]">${statement.code}</label> 
</g:each> 

लेकिन मैं सिर्फ जाँच बयान की एक सूची नियंत्रक (वहाँ सूची में null तत्व हैं करने के लिए नहीं मिल सकता है, वहाँ दोहराया जाता है बयान:

[ ] Statement Code 1 
[ ] Statement Code 2 
[ ] Statement Code 3 

मैं इस के साथ शुरुआत की ...)।

कोई विचार यह कैसे प्राप्त करें?

उत्तर

6

यह संभव है, लेकिन इसे एक हैक की आवश्यकता होती है।

<g:each in="${org.example.Statement.list(sort: 'id', order: 'asc')}" var="statement" status="i"> 
    <g:checkBox name="statements" value="${statement.id}" checked="${contract.statements.contains(statement)}" /> 
    <label for="statements">${statement.content}</label> 
</g:each> 

दूसरा, नियंत्रक में आप बंधन से पहले "_statements" संपत्ति को दूर करने के लिए है:

def contract = Contract.get(params.id) 
params.remove "_statements" 
bindData contract, params 
contract.save(failOnError: true) 

चेक बॉक्स समर्थन सबसे पहले, हर चेकबॉक्स एक ही नाम, "बयान" होना आवश्यक है इस उपयोग के मामले के लिए डिजाइन नहीं किया गया है, इसलिए एक हैक की आवश्यकता है। बहु-चयन सूची बॉक्स आमतौर पर इस प्रकार के परिदृश्य के लिए उपयोग किया जाता है।

+0

'params.remove" _statements "ने चाल की। हालांकि मैंने अपना खुद का टैग लिखा था जो छुपा _ पैरामीटर के बिना चेकबॉक्स बनाता है। – zoran119

+0

यह अजीब बात है कि चेकबॉक्स को सभी को एक ही नाम की आवश्यकता थी, लेकिन यह मेरे लिए काम करता था! – adeady

0

क्या आप सीधे अनुरोध कर रहे हैं Contract? आने वाले अनुरोध को Command object में मैप करने के लिए यह अधिक सुरक्षित है।

एक सूची मैप करने के बारे में - मूल्य केवल मौजूदा तत्वों के लिए मैप किए जाते हैं। मेरा मतलब है कि यह नई सूची तत्व नहीं बना सकता है। मैपिंग से पहले इसे तैयार करने की जरूरत है। क्या आप जानते हैं हमेशा 3 तत्वों है कि वहाँ हैं, तो आप कर सकते हैं: इस वस्तु

1

बदलें कुछ इस तरह करने के लिए चेकबॉक्स को

class ContractCommand { 

    List statements = [ 
     new Statement(), 
     new Statement(), 
     new Statement(), 
    ] 
} 

और नक्शा अनुरोध।

<g:checkBox name="statements.${statement.id}" value="true" checked="${contractInstance.statements.contains(statement)?:''}" /> 

और फिर नियंत्रक में, params.statements में आप जाँच बयानों की आईडी से एक सूची मिल जाएगा।

चेक किए गए संपत्ति में ?:'' पर भी ध्यान दें, इसे जोड़ने का एक अच्छा विचार है क्योंकि चेक किए गए संपत्ति में कोई भी मूल्य (यहां तक ​​कि 'झूठा') चेक के रूप में व्याख्या किया जाता है।

+0

इस दृष्टिकोण का उपयोग करना (और बयानों 3, 4 की जाँच और 6), 'params.statements' इस तरह दिखता है: 'कथन: [_ 3 :, _4 :, _5 :, _6 :, _1 :, _2 :, 6: सत्य, 4: सत्य, 3: सत्य] 'और यह' अनुबंध 'से जुड़ा नहीं है। मैं वास्तव में चाहता हूं कि 'पैरा' है।बयान 'इस मामले में' [3, 4, 6] 'होना चाहिए। – zoran119

2

मैं व्यक्तिगत रूप से इस मामले में आईडी की सूची प्राप्त करना पसंद करता हूं।

<g:each var="book" in="${books}"> 
    <g:checkBox name="bookIds" value="${book.id}" ... 
</g:each> 

कमान वस्तु:

class BookCommand { 
    List<Serializable> bookIds 
} 

नियंत्रक कार्रवाई में:

BookCommand bc -> 
    author.books = Book.getAll(bc.bookIds) 
संबंधित मुद्दे