2012-06-21 18 views
13

मैं एक बाहरी जावास्क्रिप्ट पुस्तकालय जो एक पाठ क्षेत्र के परिवर्तन पर चलाता है, यह प्रारूपों, आदिघटना बदलें ट्रिगर नहीं करता जब नॉकआउट अपडेट मूल्य

हालांकि, जब KnockoutJS पाठ क्षेत्र के लिए मूल्य निर्धारित करता है, परिवर्तन घटना नहीं निकाल दी गई है। Simplified Fiddle of my problem। जब नॉकआउट मेरे टेक्स्टरेरा के मान को अपडेट करता है तो क्या परिवर्तन ईवेंट को आग लगाना संभव है?

उत्तर

9

परिवर्तन घटनाओं के साथ काम करने के लिए नॉकआउट को मजबूर करने की कोशिश करने के बजाय आप अंतर्निहित पर्यवेक्षण पर सदस्यता सेट कर सकते हैं। इस तरह: http://jsfiddle.net/EZC9E/1/

this.text.subscribe(function(newValue) { 
    alert('Text is changing to ' + newValue); 
});   
+2

आपकी प्रतिक्रिया के लिए धन्यवाद। मुझे इस समाधान से अवगत है। हालांकि, मैं एक अलग पुस्तकालय का उपयोग कर रहा हूं जिसे मैं इस उद्देश्य के लिए संशोधित नहीं करना चाहता हूं। –

+1

आखिर में मैं इस समाधान के साथ गया क्योंकि स्पष्ट रूप से मुझे वांछित परिणाम प्राप्त करने का कोई और तरीका नहीं मिला। इसमें लाइब्रेरी को संशोधित करना शामिल था जो मुझे पसंद नहीं है, लेकिन यह अब काम करता है और यह सबसे महत्वपूर्ण बात है। –

1

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

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

ko.bindingHandlers.jQueryPluginFunctionCall = { 
    init: function (element, valueAccessor, allBindingsAccessor) { 
     // Apply jQuery plugin to textarea 
     $(element).jQueryPluginFunctionCall(); 

     // Subscribe to the value binding of the textarea, and trigger the change event. 
     allBindingsAccessor().value.subscribe(function() { 
      $(element).trigger('change'); 
     }); 

     // Clean up jQuery plugin on dispose 
     ko.utils.domNodeDisposal.addDisposeCallback(element, function() { 
      // This will be called when the element is removed by Knockout or 
      // if some other part of your code calls ko.removeNode(element) 
      $(element).jQueryPluginFunctionCall('destroy'); 
     }); 
    } 
} 
संबंधित मुद्दे