2012-05-14 36 views
12

मेरे पास एक दृश्य मॉडल पर एक देखने योग्य के लिए एक चेकबॉक्स है। मुझे अनिवार्य रूप से पॉप अप करने की आवश्यकता है "क्या आप निश्चित हैं?" पुष्टिकरण संकेत अगर उपयोगकर्ता इसे सच से गलत में बदल देता है। मुझे "रद्द करने योग्य" परिवर्तन करने के लिए सबसे अच्छी जगह का पता लगाने में एक भयानक समय है। । ।नॉकआउट - एक परिवर्तन घटना रद्द करें?

1) क्लिक करें घटना 2) ViewModel आंतरिक सदस्यता ले "beforeChange" के लिए jQuery हैंडलर 3) ViewModel आंतरिक सदस्यता के (सामान्य)

किसी भी मामले में, मैं बेहद परिवर्तन रद्द करने का मौका दिया जाना पसंद करते हैं परिवर्तन पर प्रतिक्रिया करने के मुकाबले, संभावित रूप से इसे वापस अपने पिछले मूल्य पर वापस लाने की आवश्यकता होने पर।

क्या नॉकआउट की सदस्यता कार्यक्रम आपको परिवर्तन रद्द करने का मौका देता है? किसी भी जानकारी की सराहना की जाएगी। धन्यवाद!

http://jsfiddle.net/rniemeyer/cBvXM/

<input type="checkbox" data-bind="click: confirmCheck, checked: myvalue" /> 

js:

उत्तर

22

यहाँ jQuery के stopImmediatePropagation का उपयोग कर एक सरल विकल्प है

var viewModel = { 
    myvalue: ko.observable(false), 
    confirmCheck: function(data, event) { 
     if (!confirm("Are you sure?")) { 
      event.stopImmediatePropagation();    
      return false; 
     } 
     return true; 
    } 
}; 
+0

ओह, मेरे भगवान! यह fantastically मददगार है। मैं jQuery के स्टॉप के बारे में कभी नहीं जानता थाइमीडिएटप्रोपैगेशन()। जबकि मैं आमतौर पर मुख्य दृश्य मॉडल के बाहर jQuery सामग्री को संदर्भित करने से बचने का प्रयास करता हूं, यह मेरी समस्या के लिए एक अच्छा समाधान है। फिर से धन्यवाद! – blaster

+2

मेरे मामले में 'event.stopImmediatePropagation' ने कोउ व्यू मॉडल में बदलने से मूल्य को नहीं रोका। मुझे फिर से मान सेट करना पड़ा: 'var cb = event.target; ... data.myvalue (! cb.checked); ' – Sprockincat

+10

इस मामले में डेटा-बाइंड का क्रम * बहुत * महत्वपूर्ण है। यदि आप * पहले * ईवेंट को मानते हैं, तो मूल्य बाध्यकारी पहले निष्पादित होता है। यदि घटना बाध्य है, तो यह पहले निष्पादित होगी और प्रचार को रोक देगा। इसे टूटा हुआ देखने के लिए यह पहेली देखें: http://jsfiddle.net/8AuVj/ –

12
क्योंकि @RP नीमेयेर जवाब में टिप्पणी की समस्याओं की

, मैं सिर्फ क्रियान्वित किया है यह विस्तारक:

ko.extenders.confirmable = function(target, options) { 
    var message = options.message; 
    var unless = options.unless || function() { return false; } 
    //create a writeable computed observable to intercept writes to our observable 
    var result = ko.computed({ 
     read: target, //always return the original observables value 
     write: function(newValue) { 
      var current = target(); 

      //ask for confirmation unless you don't have 
      if (unless() || confirm(message)) { 
       target(newValue); 
      } else { 
       target.notifySubscribers(current); 
      } 
     } 
    }).extend({ notify: 'always' }); 

    //return the new computed observable 
    return result; 
}; 

फिर आप इस तरह अपने मॉडल को लागू कर सकते हैं:

var viewModel = { 
    myvalue: ko.observable(false).extend({confirmable: "Are you sure?"}); 
} 

और, अगर वहाँ एक मामला था, जिसमें पुष्टि के लिए पूछने के लिए नहीं है (यह मूर्खतापूर्ण उदाहरण में, हम मार्च के दौरान पुष्टि छोड़ देंगे), आप कर सकते हैं:

var viewModel = { 
    myvalue: ko.observable(false).extend({confirmable: { message: "Are you sure?", unless: function() { return new Date().getMonth() == 2 }} }); 
} 
+1

भव्य! इसका इस्तेमाल कई परिदृश्यों में किया जा सकता है। बस एक बात, इसे इस तरह इस्तेमाल किया जाना चाहिए: '.extend ({पुष्टि करने योग्य: {संदेश:" क्या आप निश्चित हैं? ", जब तक: फ़ंक्शन() {नई तारीख() लौटें। GetMonth() == 2}}}) ; – Sljux

+0

अच्छा! यह एक शानदार इंजीनियर विचार है। –

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