2013-04-27 8 views
7

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

कुछ की तरह:

<div data-bind="html: dynamicHtml, afterRender: customCode"></div> 

... 

MyViewModel.prototype.customCode = function(){ 
    ko.applyBindings(self.MyInnerViewModel(), document.getElementById('someTagInTheDynamicHtml')); 
}; 

afterRender यहाँ कहा जाता है नहीं (केवल टेम्पलेट बाध्यकारी साथ काम करता है?), और एक कस्टम बंधन या तो मदद नहीं करता है, क्योंकि "update" घटना के नाम से जाना इसकी गारंटी नहीं है डोम अपडेट होने के बाद।

उत्तर

12

हां, afterRendertemplate केवल बाध्यकारी के साथ काम करता है।

लेकिन आप कस्टम बाध्यकारी हैंडलर बना सकते हैं जो html बाध्यकारी परिवर्तन ट्रैक करता है और मान अपडेट होने पर कॉलबैक को सक्रिय करता है। मेरे उदाहरण:

ko.bindingHandlers.afterHtmlRender = { 
    update: function(el, va, ab){ 
     ab().html && va()(ab().html); 
    } 
} 

छोटा परम नाम: va - valueAccessor, अब - allBindings

इसके अलावा मार्कअप की तरह दिखना चाहिए (बंधन का नाम बदल दिया गया है):

<div data-bind="html: dynamicHtml, afterHtmlRender: customCode"></div> 

http://jsfiddle.net/dDDjf/

अद्यतन

स्पष्टीकरण के साथ

सरलीकृत बाध्यकारी कोड:

ko.bindingHandlers.afterHtmlRender = { 
    update: function(element, valueAccessor, allBindings){ 
     // check if element has 'html' binding 
     if (!allBindings().html) return; 
     // get bound callback (don't care about context, it's ready-to-use ref to function) 
     var callback = valueAccessor(); 
     // fire callback with new value of an observable bound via 'html' binding 
     callback(allBindings().html); 
    } 
} 
+0

धन्यवाद - बहुत अच्छा काम करता है। मुझे लगता है कि इसे 'ab()। Html()' से शुरू करना चाहिए, नहीं? साथ ही, क्या आप इस कोड को दोबारा प्रतिक्रिया दे सकते हैं कि लोग क्या समझ रहे हैं कि क्या हो रहा है ..? – seldary

+0

नहीं, 'ab()। Html' होना चाहिए। यह सभी बाइंडिंग के बीच * एचटीएमएल * बाध्यकारी अस्तित्व की जांच है। मैंने स्पष्टीकरण के साथ अपना जवाब अपडेट कर लिया है। –

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