Grails: चेकबॉक्स को वापस झूठ पर सेट नहीं किया जा रहा है


8

मैं एक Grails (1.0.4) ऐप विकसित कर रहा हूं जहां मैं ग्रिड व्यू में एक पृष्ठ पर संग्रहों का संग्रह संपादित करना चाहता हूं। मुझे स्प्रिंग एमवीसी के अनुक्रमित पैरामीटर हैंडलिंग पर निर्भर करता है, केवल एक चीज को छोड़कर:

बूलियन (या, उस मामले के लिए, बूलियन) मान ग्रिड में मूल्य चेकबॉक्स के माध्यम से सेट किया जा सकता है, लेकिन सेट नहीं किया जा सकता , यानी जब मैं चेकबॉक्स और अद्यतन की जांच करता हूं, तो मान सत्य पर सेट होता है, लेकिन बाद में जब मैं फिर से संपादित करता हूं, तो चेकबॉक्स को अनचेक करें और अपडेट करें, यह सच है।

यह चेक बॉक्स की जीएसपी कोड है:

<g:checkBox name="tage[${indexTag}].zuweisungen[${indexMitarb}].fixiert" value="${z.fixiert}" /> 

और इस HTML कि उत्पन्न किया जाता है:

<input type="hidden" name="tage[0].zuweisungen[0]._fixiert" /> 
<input type="checkbox" name="tage[0].zuweisungen[0].fixiert" checked="checked" id="tage[0].zuweisungen[0].fixiert" /> 

मैं एक Grails bug कि वास्तव में इस आशय का वर्णन करता है मिल गया है, लेकिन यह है 1.0.2 में तय के रूप में चिह्नित, और वहां वर्णित समस्या तंत्र (छिपे हुए क्षेत्र के नाम में अंडरस्कोर गलत जगह पर रखा गया है) मेरे मामले में मौजूद नहीं है।

कोई विचार क्या कारण हो सकता है?

1

मैं एक छोटा नमूना ऐप तैयार करूंगा जो समस्या का प्रदर्शन करता है और इसे Grails बग (या एक नया बना देता है) से जोड़ता है। यहां कोई भी आपके नमूना ऐप को डीबग करने में सक्षम हो सकता है या आपने दिखाया होगा कि बग वास्तव में तय नहीं है।

  0

मुझे लगता है कि आप 'चमक' के बजाय 'दिखाया' मतलब है। :-) 25 feb. 092009-02-25 20:35:04

  0

अभी यह करने के लिए बहुत आलसी :) शायद सबसे अच्छा दीर्घकालिक समाधान, हालांकि। 01 mar. 092009-03-01 13:00:26


1

मुझे लगता है कि सबसे आसान कामकाज एक डीबगर संलग्न करना होगा और देखें कि क्यों Grails मूल्य को पॉप्युलेट करने में असफल रहा है। Grails को ध्यान में रखते हुए ओपन सोर्स है, आप स्रोत कोड तक पहुंच पाएंगे और एक बार जब आप इसका समाधान समझ लेंगे तो आप अपना संस्करण पैच कर सकते हैं।

मुझे यह अन्य बग GRAILS-2861 भी मिला है जो बूलियन के लिए बाध्यकारी से संबंधित मुद्दे का उल्लेख करता है (थ्रेड में मार्क की टिप्पणी देखें)। मुझे लगता है कि वास्तव में आप जिस समस्या का वर्णन कर रहे हैं वह है।

  0

दुर्भाग्य से, सभी गतिशील और मेटाप्रोग्रामिंग जादू grails में चल रहा है जब तक कि आप वास्तव में कहां देखना है - शायद स्प्रिंग एमवीसी के अंदर कहीं भी यह डीबग करना लगभग असंभव बनाता है। जो मैं वास्तव में नहीं जानता। 01 mar. 092009-03-01 13:02:16

  0

आपके द्वारा लिंक की गई बग एक अलग मामला है, मुझे लगता है - मूल रूप से HTML और grails में "मान" विशेषता के विभिन्न अर्थों के आधार पर एक गलतफहमी। 01 mar. 092009-03-01 13:02:59

  0

मुझे कबूल करना होगा कि मुझे अभी भी विश्वास है कि ये दोनों संबंधित हैं :-)। आपके द्वारा नीचे पोस्ट किए गए समाधान को देखकर ऐसा लगता है कि समस्या यह तथ्य है कि छिपी हुई या चेकबॉक्स में फॉर्म जमा होने पर प्रेषित होने का कोई मूल्य नहीं है (जिस पर टिकट पर चर्चा की जाती है)। 01 mar. 092009-03-01 20:23:22

  0

जो समाधान आप पोस्ट कर रहे हैं, मुझे लगता है कि आपको कस्टम टैग कोड देखना चाहिए और देखें कि मूल्य विशेषता क्यों उत्पन्न नहीं हुई है। एक बार आपके पास HTML में लिखी गई विशेषता होगी, तो मुझे उम्मीद है कि यह समस्या ठीक हो जाएगी। 01 mar. 092009-03-01 20:24:47

  0

मैं इस मुद्दे पर श्री जी और ग्रीम की राय पाने की कोशिश कर रहा हूं। 01 mar. 092009-03-01 20:29:47

  0

नहीं, समस्या यह है कि HTML एक अनचेक चेकबॉक्स के लिए कुछ भी प्रसारित नहीं करता है (चेक किए गए एक के लिए, यदि कोई निर्दिष्ट नहीं है तो यह डिफ़ॉल्ट मान के रूप में "चालू" होता है)। छुपा क्षेत्र उस के लिए एक कामकाज है। 02 mar. 092009-03-02 10:45:23

  0

और जहां तक ​​मैं इसे समझता हूं, grails में "मान" विशेषता HTML के मुकाबले एक बिल्कुल अलग अर्थ है - grails में यह निर्धारित करता है कि फ़ॉर्म में चेकबॉक्स सेट या सेट होना चाहिए या नहीं। एचटीएमएल में यह स्ट्रिंग है जो चेकबॉक्स सेट होने पर सर्वर को भेजी जाती है। 02 mar. 092009-03-02 10:49:01

  0

@ माइकल: अनचेक किए गए चेकबॉक्स अनचेक किए जाने पर संचारित नहीं होते हैं (यह HTML सामान्य व्यवहार है), इसलिए यदि Grails वहां कुछ मूल्य पर निर्भर करता है, तो आपको केवल एक जावास्क्रिप्ट फ़ंक्शन जोड़ने की आवश्यकता है जो फॉर्म के लिए जाता है। और इसे लापता लोगों के लिए छुपा मूल्य सेट करें। 02 mar. 092009-03-02 23:33:24

  0

Grails को छिपे हुए क्षेत्र का उपयोग करने के लिए अनुमान लगाया जाना चाहिए कि उसी नाम के साथ चेकबॉक्स (सैन्स अंडरस्कोर) अनचेक किया गया है यदि यह अनुरोध पैराम में मौजूद नहीं है - जो नियमित फ़ील्ड के लिए काम करता है, लेकिन किसी कारण से अनुक्रमित फ़ील्ड में विफल रहता है। 03 mar. 092009-03-03 00:28:31


0

इस प्रयास करें, डिबग करने के लिए लॉग निर्धारित करते हैं, frist कोशिश पहले 3 अगर वे समस्या दिखाई नहीं देती हैं, उन सब को डिबग करने के लिए फ्लिप:

codehaus.groovy.grails.web.servlet="error" // controllers 
codehaus.groovy.grails.web.pages="error" // GSP 
codehaus.groovy.grails.web.sitemesh="error" // layouts 
codehaus.groovy.grails."web.mapping.filter"="error" // URL mapping 
codehaus.groovy.grails."web.mapping"="error" // URL mapping 
codehaus.groovy.grails.commons="info" // core/classloading 
codehaus.groovy.grails.plugins="error" // plugins 
codehaus.groovy.grails.orm.hibernate="error" // hibernate integration 

यह आपको वास्तव में जब देखने के लिए अनुमति चाहिए और पैरामीटर सेटिंग कैसे विफल हो रही है और शायद आसपास के काम को समझें।

  0

दुर्भाग्यवश, मुझे लॉग में कोई भी उपयोग करने योग्य संकेत नहीं मिला है - यह नहीं जानता कि "._fixiert" param को कैसे मैप करना है, लेकिन निश्चित रूप से यह डोमेन मॉडल में मौजूद नहीं है, क्योंकि यह सिर्फ एक संकेत है कि अनुपस्थिति ".fixiert = on" का अर्थ है कि इसे गलत पर सेट किया जाना चाहिए। 01 mar. 092009-03-01 13:05:53


2

यह मेरा खुद का समाधान है, मूल रूप से एक वैकल्पिक हल मैन्युअल grails डेटा बाइंडिंग क्या कर किया जाना चाहिए है कि (लेकिन नहीं) है:

Map<String,String> checkboxes = params.findAll{def i = it.key.endsWith("._fixiert")} // all checkboxes 
checkboxes.each{ 
    String key = it.key.substring(0, it.key.indexOf("._fixiert")) 
    int tagIdx = Integer.parseInt(key.substring(key.indexOf('[')+1, key.indexOf(']'))) 
    int zuwIdx = Integer.parseInt(key.substring(key.lastIndexOf('[')+1, key.lastIndexOf(']'))) 
    if(params.get(key+".fixiert")) 
    { 
     dienstplanInstance.tage[tagIdx].zuweisungen[zuwIdx].fixiert = true 
    } 
    else 
    { 
     dienstplanInstance.tage[tagIdx].zuweisungen[zuwIdx].fixiert = false      
    } 
} 

काम करता है, grails अपने आप में कोई बदलाव नहीं आया आवश्यकता है, लेकिन 'isn टी पुन: प्रयोज्य (शायद कुछ अतिरिक्त काम के साथ बनाया जा सकता है)।


3

यह समाधान जूलियस हुआंग नामक एक लड़का है जो grails-user मेलिंग सूची पर प्रस्तावित है। यह पुन: प्रयोज्य है लेकिन एक अनचेक चेकबॉक्स के लिए "झूठी" प्रतिक्रिया के साथ एक छिपे हुए क्षेत्र को पॉप्युलेट करने के लिए जावास्क्रिप्ट पर निर्भर करता है कि दुर्भाग्य से HTML नहीं भेजता है।

मैं हैक भेजने के लिए जीएसपी "गलत" जब अचिह्नित बॉक्स (सही -> गलत) कस्टम taglib साथ।

डिफ़ॉल्ट चेकबॉक्स अचिह्नित, तो मैं ईवेंट हैंडलर के रूप में चेकबॉक्स का उपयोग, लेकिन इसके बजाय छिपा क्षेत्र भेज जब कुछ भी नहीं भेज सकते हैं।

नियंत्रक में "पैरा" "झूठी" -> "सत्य" बिना किसी संशोधन को संभाल सकता है। जैसे। नियंत्रक में सब कुछ रहता है।

जीएसपी में कस्टम टैग का उपयोग (नमूना usedfunc_F "सही" है),

<jh:checkBox name="surveyList[${i}].usedfunc_F" value="${survey.usedfunc_F}"></jh:checkBox> 

यहाँ टैग उत्पन्न है,

<input type="hidden" name="surveyList[#{i}].usedfunc_F" id="surveyList[#{i}].usedfunc_F" value="false" /> 
<input type="checkbox" onclick="jhtoggle('surveyList[#{i}].usedfunc_F')" checked="checked" /> 

जावास्क्रिप्ट

<script type="text/javascript"> 
function jhtoggle(obj) { 
    var jht = document.getElementById(obj); 
    jht.value = (jht.value !='true' ? 'true' : 'false'); 
} 
</script>