2013-08-27 5 views
10

पर फायरिंग नहीं है मेरे पास एक कस्टम नॉकआउट बाध्यकारी है जो टॉगल स्विच को 'ऑन' या 'ऑफ' स्थिति में एनिमेट करता है। मेरी समस्या यह है कि अद्यतन फ़ंक्शन केवल init के तुरंत बाद आग लग जाता है और जब अवलोकन योग्य मान बदलता है। कोई विचार क्या मैं गलत कर रहा हूँ?नॉकआउट कस्टम बाइंडिंग अपडेट फ़ंक्शन

ko.bindingHandlers.toggleSwitch = { 

    init: function (element, valueAccessor) { 
     var valueUnwrapped = ko.utils.unwrapObservable(valueAccessor()); 
     var value = valueUnwrapped.value; 
     var target = $(element); 
     var disabled = valueAccessor().disabled; 

     var id = 'ul' + (++ko.bindingHandlers['uniqueId'].currentIndex); 
     var html = ['<div class="switch-mask"><ul id="' + id + '"', 'class="on-off-switch">', '<li class="on-switch">' + valueAccessor().on + '</li>', '<li class="on-off-knob"></li>', '<li class="off-switch">' + valueAccessor().off + '</li>', '</ul></div>'].join(''); 

     target.replaceWith(html); 

     var mainTarget = $('#' + id); 
     if (value()) { 
      mainTarget.children('.on-switch').animate({ 'margin-left': '0px' }); 
      mainTarget.children('.on-off-knob').animate({ 'margin-left': '0px' }); 
     } 
     else { 
      mainTarget.children('.on-switch').animate({ 'margin-left': '-28px' }); 
      mainTarget.children('.on-off-knob').animate({ 'margin-left': '-1px' }); 
     }; 

     if (!disabled) { 
      mainTarget.on('click', function() { 
       //this fires every time the toggle switch is clicked. 
       var valueUnwrapped = ko.utils.unwrapObservable(valueAccessor()); 
       if (value()) { 
        mainTarget.children('.on-switch').animate({ 'margin-left': '0px' }); 
        mainTarget.children('.on-off-knob').animate({ 'margin-left': '0px' }); 
        value(false); 
       } else { 
        mainTarget.children('.on-switch').animate({ 'margin-left': '-28px' }); 
        mainTarget.children('.on-off-knob').animate({ 'margin-left': '-1px' }); 
        value(true); 
       } 

       value.valueHasMutated(); 
      }); 
     } 
    }, 
    update: function (element, valueAccessor) { 
     var value = valueAccessor(); 
     var valueUnwrapped = ko.utils.unwrapObservable(valueAccessor()); 
     console.log('update called'); 
    } 
}; 

ko.virtualElements.allowedBindings.toggleSwitch = true; 

यह मेरा बाध्यकारी है:

<!-- ko toggleSwitch:{value:data.model.Settings.HtmlEmail,on:'On',off:'Off'}--> 
<!-- /ko --> 

उत्तर

16

अद्यतन गतिविधि सक्रिय किया जा रहा है क्योंकि आप नमूदार के लिए सीधे रूप से बाध्य नहीं कर रहे हैं, लेकिन एक वस्तु एक संपत्ति युक्त करने के लिए नमूदार को value सेट नामित । , पिल्ला

ko.bindingHandlers.toggleSwitch = { 

    init: function (element, valueAccessor) { 
    var valueUnwrapped = ko.utils.unwrapObservable(valueAccessor()); 
    var value = valueUnwrapped.value; 

    /// logic omitted for clarity 

    value.subscribe(function(newValue) { 
     console.log('update called'); 
    }); 

    if (!disabled) { 
     /// omitted for clarity 
    } 
    } 
}; 
+11

लगता है जैसे मैं कर रहा हूँ: मैं कैसे अतीत में इस कार्य किया है उसे अद्यतन समारोह init समारोह में में नमूदार पर कस्टम बाध्यकारी और सिर्फ सेट एक सदस्यता पर छोड़, इस तरह है मेरे अगले बच्चे XDumaine नामकरण। आपकी मदद के लिए बहुत बहुत धन्यवाद। – SquidScareMe

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