2012-03-01 12 views
7

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

यहाँ मेरी ViewModel है:

var innerModel = { 
    name: ko.observable('junk') 
}; 

var innerModel2 = { 
    name: ko.observable('junk2') 
}; 

var viewModel = { 
    im1: innerModel, 
    im2: innerModel2, 
    selectedModel: ko.observable({name:'xxx'}) 
}; 

और यहाँ मेरी customBinding है:

ko.bindingHandlers.custom = { 
    update: function(element, valueAccessor) { 
     console.log("BAM!"); 
     while (element.firstChild) 
      ko.removeNode(element.firstChild); 

     ko.renderTemplate('test', valueAccessor(), {}, element, 'replaceNode'); 

    } 
}; 

जहां मेरे टेम्पलेट बस एक अवधि है कि "नाम" फ़ील्ड प्रदर्शित करता है:

<script id='test' type='text/html' charset='utf-8'> 
<span data-bind='text: name'></span> 
</script> 

यहां HTML है जिसका उपयोग मैं कस्टम बाइंडिंग के साथ करता हूं:

<div id="container" data-bind="with: viewModel"> 
    <div data-bind="custom: selectedModel"> 
    </div> 
</div> 

जब मैं चयनित आंतरिक मॉडल को दो आंतरिक मॉडलों में से किसी एक में अद्यतन करता हूं, तो सही नाम प्रदर्शित होता है लेकिन कस्टम बाइंडिंग के 'अपडेट' फ़ंक्शन को नहीं कहा जा रहा है। मैं "selectedModel" नमूदार के लिए एक अलग ग्राहक है:

viewModel.selectedModel.subscribe(function(newValue) { 
    console.log(newValue.name()); 
}); 

और कहा कि जब मैं selectedModel बदल कहा जाता है, तो क्यों नहीं customBinding के अद्यतन बुलाया जा रहा है? http://jsfiddle.net/gperng/twAcJ/

किसी भी मदद की सराहना की जाएगी:

यहाँ एक jsfiddle कि इस मुद्दे से पता चलता है!

उत्तर

0

इस मामले में with का उपयोग गलत है। आप इस का उपयोग करते हैं, यह आपकी अपेक्षा के अनुसार काम करेंगे:

<div id="container" data-bind="with: selectedModel"> 
    <div data-bind="custom: $data"> 
    </div> 
</div> 

यह selectedModel पर नहीं है क्योंकि आपके उदाहरण custom में बाध्यकारी है, लेकिन पूरे ViewModel पर ही जो नहीं बदलता है। http://jsfiddle.net/soniiic/twAcJ/7/

+1

मैं 100% नहीं हूँ

यहाँ यह की jsfiddle है यह समझ आता है। यदि मैं "बाध्यकारी" के साथ div को बाहर ले जाता हूं, तो भी मैं पहले जैसा ही मुद्दा चलाता हूं (जहां कस्टम बाइंडिंग के अपडेट हैंडलर को अवलोकन योग्य होने के बावजूद नहीं कहा जा रहा है)। इसके अलावा, आपके उदाहरण में, कस्टम बाध्यकारी के "init" को हर बार बुलाया जा रहा है (क्योंकि माता-पिता के साथ देखने योग्य है और यह बदल गया है, इसलिए नीचे दिए गए सभी बाल तत्व पुनः प्रस्तुत किए जाते हैं)। Http://jsfiddle.net/gperng/6nw8B/ देखें, मैंने एक "init" फ़ंक्शन जोड़ा और आप देख सकते हैं कि बाइंडिंग हर बार फिर से शुरू हो रही है। –

9

आप इसे काम करने के लिए निम्नलिखित समारोह कॉल करने की आवश्यकता:

var valueUnwrapped = ko.utils.unwrapObservable(valueAccessor()) 

अधिक के लिए यह बेला का प्रयास करें: http://jsfiddle.net/twAcJ/13/

+0

यह वास्तव में मेरे लिए काम नहीं करता है। यह केवल प्रिंट करता है "बाम!" एक बार, कभी। कई बार सभी बटन दबाए बावजूद। ध्यान दें कि मैंने नॉकआउट 3.0.0 चुना है (हालांकि 2.3.0 या तो काम नहीं करता है)। – Aktau

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