2011-09-26 40 views
5

मैं को का एक विशेष विस्तारित संस्करण का उपयोग कर रहा हूं जो एक आश्रित()/peek() प्रकार फ़ंक्शंस को एक आश्रित पर उपयोग करता है ताकि मैं डेटा को केवल फॉर्म पर सहेज सकूं यदि यह डेटाबेस (ओके पर) के लिए प्रतिबद्ध है और रद्द पर वापस लाया।नॉकआउट जे में चेकबॉक्स क्यों चेक किया जाता है जब केवल चेक किया जाता है?

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

क्यों नॉकआउट FALSE मान नहीं लिख रहा है?

कोड के साथ UPDATED प्रश्न:

कृपया प्रदर्शित करने के लिए इस JsFiddle देखने के लिए यहाँ: http://jsfiddle.net/b2Qu2/3/

माइनर मुद्दा

नोट वहाँ डेमो के साथ 1 अन्य समस्या यह है कि - के लिए कुछ कारण, जब मैं चेकबॉक्स को चेक/अनचेक करता हूं, तो यूआई पर peeked मान अपडेट नहीं किया जाता है, भले ही यह एक आश्रित ऑब्जेर्जेबल के लिए जंजीर हो। आप अभी भी 'peek' बटन पर क्लिक करके मूल्य को देख सकते हैं।

प्रमुख मुद्दा

समस्या को पुन: करने के लिए:

1) Click 'peek' button: Shows FALSE - CORRECT 

2) Check IsAdmin checkbox 

3) Click 'peek' again: Shows TRUE - CORRECT 

4) Uncheck IsAdmin 

5) Click 'peek' again: SHOWS TRUE - INCORRECT!! 

उदाहरण परिदृश्य

एक संवाद की कल्पना को व्यवस्थापकीय उपयोगकर्ता के लिए एक चेकबॉक्स के साथ दिखाया गया है। केवल 1 व्यवस्थापक उपयोगकर्ता सेट किया जा सकता है, और यदि कोई व्यवस्थापक उपयोगकर्ता पहले से मौजूद है तो सर्वर वैध/अमान्य के साथ प्रतिक्रिया देता है। उपयोगकर्ता तब चेकबॉक्स को अनचेक करता है, लेकिन अब व्यूमोडेल सोचता है कि चेकबॉक्स हमेशा सत्य है ?? संरक्षित ऑब्सर्वेबल का उपयोग करने का कारण यह है कि यदि सर्वर प्रतिक्रिया सफल होती है, तो प्रतिबद्ध() विधि को कॉल किया जाता है ताकि UI पर सब कुछ जारी रहे। यदि उपयोगकर्ता संवाद रद्द करता है या कोई त्रुटि उत्पन्न होती है, तो मूल मान ओवरराइट नहीं होते हैं।

+0

आप अपने कोड के और अधिक साझा कर सकते हैं, जहाँ तक कैसे यह स्वाभाविक है/इस्तेमाल किया? –

+0

@ आरपी निमेयर - मैंने कुछ प्रश्न के साथ अपना प्रश्न अपडेट कर लिया है। इस के साथ संघर्ष कर रहा है !! – jaffa

उत्तर

3

कारण यह है कि लेखन केवल एक मूल्य पर गोलीबारी कर रहा है क्योंकि यह केवल तभी ट्रिगर होगा जब यह मानता है कि इसे इसके खिलाफ बाध्य होने के लिए एक अलग मूल्य लिखने की आवश्यकता है। तो, आपके संरक्षित ऑब्सर्वेबल का वास्तविक मूल्य बदल नहीं रहा है। यदि यह सत्य है और आप इसे सत्य पर सेट करने का प्रयास करते हैं, तो लेखन आग नहीं होता है, क्योंकि इसका मानना ​​है कि इसका सही मूल्य है। इस संस्करण आप field1 या field1.temp के खिलाफ बाध्य कर सकते हैं के साथ

ko.protectedObservable = function (initialValue) { 
    //private variables 
    var _actual = ko.observable(initialValue), 
     _temp = ko.observable(initialValue); 

    //access to temp value 
    _actual.temp = _temp; 

    //commit the temporary value to our observable, if it is different 
    _actual.commit = function() {   
     if (_temp() !== _actual()) { 
      _actual(_temp()); 
     } 
    }; 

    //notify subscribers to update their value with the original 
    _actual.reset = function() { 
     _actual.valueHasMutated(); 
     _temp(_actual()); 
    }; 

    return _actual; 
}; 

:

मैं शायद यह थोड़ा बदल सकते हैं और कुछ इस तरह का प्रयोग करेंगे। आपको यहां तक ​​कि एक झांक की भी आवश्यकता नहीं है, क्योंकि अस्थायी और वास्तविक मूल्य दोनों अवलोकन योग्य हैं।

यह इस तरह दिखेगा: http://jsfiddle.net/rniemeyer/BwDYE/

+0

हाय, कोड उदाहरण के लिए धन्यवाद।मेरा पूरा कोड-बेस संरक्षित ऑब्सर्जेबल पर आधारित है जो मेरी पहली पहेली के आधार पर है, इसलिए सुनिश्चित नहीं है कि मैं इसके व्यवहार/बाइंडिंग को बदलना चाहता हूं। मॉडल पर बाइंडिंग .temps की बजाय वास्तविक संरक्षित ऑब्सर्बल्स का उपयोग करते हैं। आपका उदाहरण रीसेट() पर आधारित है यदि संवाद बॉक्स को रद्द कर दिया गया है/सर्वर त्रुटि और सफलता पर प्रतिबद्ध()। मेरा मॉडल उलटा हुआ है, अगर उपयोगकर्ता बाहर निकलता है, या सर्वर त्रुटि तो कुछ भी नहीं करता है क्योंकि सर्वर पर भेजने के लिए peeked मानों का उपयोग किया जाता है। यदि सर्वर सफल होता है, तो प्रतिबद्ध करें()। एमएम, यह सुनिश्चित नहीं है कि इस दौर को कैसे प्राप्त किया जाए ... – jaffa

+1

मुझे यकीन नहीं है कि मैं काफी अलग हूं कि यह कैसे अलग है। बस 'yourfield' के बजाय 'yourfield.temp' पर सब कुछ बांधें। इसे बाहर काम करना चाहिए। हो सकता है कि आप मुझे बेहतर समझने में मदद कर सकें कि यह आपके परिदृश्य में कैसे काम नहीं करता है? उपयुक्त विकल्प के साथ आने में मदद करने में खुशी होगी। –

+1

क्या यह सुनिश्चित करने का कोई तरीका है कि चेकबॉक्स depedentObservable मान हमेशा इस पर ध्यान दिए बिना कि यह अपने मूल मूल्य से बदल गया है या नहीं। ऐसा लगता है कि यह समस्या है और आपके मूल उत्तर के साथ संबंध है। मैंने अपने मूल कोड पर लेखन फ़ंक्शन में डीबग स्टेटमेंट डाले हैं, और यह केवल तभी कॉल किया जाता है जब चेकबॉक्स मान उसके मूल मूल्य के विपरीत होता है जो कि अच्छा नहीं है, क्योंकि peeked value को अपडेट नहीं किया जाएगा। अगर इसे ठीक किया जा सकता है तो मुझे अपने सभी विचारों को .temps से प्रतिस्थापित करने की आवश्यकता नहीं होगी। उम्मीद है कि यह समझ में आता है! मुझे बताएं कि आपको क्या लगता है कि आगे का सबसे अच्छा तरीका है। – jaffa

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

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