2013-07-19 4 views
8

मैं जो एक ko.observable एक div की conent का प्रतिनिधित्व करने, इसलिए की तरह होता है एक दृश्य मॉडल का उपयोग करना:KnockoutJS: 'एचटीएमएल' बंधन, नए तत्व बाध्यकारी नहीं

function claimContainerViewModel(elem, api) { 
    this.content = ko.observable('<somecontent>'); 
} 

कुछ बाद में समय में, मैं अद्यतन एक AJAX कॉल का उपयोग करके उस सामग्री, और मैं बाध्यकारी निम्नलिखित के साथ एक div है:

<div id="ClaimContainer" data-bind="html: content"> 

एचटीएमएल 'सामग्री' के लिए दिए गए डेटा-बाँध के अपने आप की है, और इस मुद्दे है: उन बंधनों से कोई भी कर रहे हैं पार्स किया जा रहा है। नॉकआउट के अनुसार, और मैंने जो भी स्रोत पढ़ा है, ऐसा होने वाला है। 'एचटीएमएल' बाध्यकारी का उपयोग करते समय, केओ को फिर से बांधने के लिए पर्याप्त स्मार्ट माना जाता है।

क्या यह केओ 2.2.0 में एक बग है (संस्करण मैं इस बहुत दूसरे के साथ फंस गया हूं), या क्या मैं गलत व्याख्या कर रहा हूं कि एचटीएमएल बाइंडिंग हैंडलर कैसे काम करता है? और इससे पहले कि कोई पूछता है, कोई आवेदन नहीं है इस मामले में बाइंडिंग काम नहीं करेंगे, क्योंकि कंटेनर एक एचटीएमएल बाइंड का उपयोग करता है, जो लागू होता है बाइंडिंग मानते हैं कि खुद को फिर से बांधना है (मैंने इसे केओ के कोड में कदम से पुष्टि कर लिया है)।

उत्तर

12

अद्यतन:

यह मेरा कस्टम बंधन के अंतिम संस्करण है। यह अब स्वचालित रूप से काम करता है, दोगुनी बाध्य नहीं करता है, और 'html' बाध्यकारी की तरह काम करता है, लेकिन अधिक गतिशील।

if (!ko.bindingHandlers['dynhtml']) { 
    ko.bindingHandlers['dynhtml'] = { 
     'init': function() { 
      return { 'controlsDescendantBindings': true }; 
     }, 
     'update': function (element, valueAccessor, allBindings, viewModel, bindingContext) { 
      ko.utils.setHtml(element, valueAccessor()); 
      ko.applyBindingsToDescendants(bindingContext, element); 
     } 
    }; 
} 

कृपया, कृपया, कृपया ध्यान रखें है कि इस करता है, तो आप अपने HTML का स्रोत पता नहीं है असुरक्षित हो सकता है हो सकता है। बहुत, बहुत असुरक्षित। यदि असंगत उपयोगकर्ता इनपुट कभी भी इसे आपके HTML में बना सकता है, तो यह एक बड़ा सुरक्षा छेद हो सकता है, इसलिए क्रॉस साइट स्क्रिप्टिंग हमलों के लिए देखें।

+0

एक चेतावनी: यह स्वचालित रूप से रिवाइंड नहीं करता है, आपको अभी भी आवेदन बाइंडिंग कॉल करने की आवश्यकता है। यह सिर्फ यह अनुमति देता है। मेरी समझ से 'टेम्पलेट' बाइंडिंग इस मामले में बहुत बेहतर काम करती हैं, लेकिन वे मेरे उपयोग के मामले के लिए एक विकल्प नहीं हैं ... इसलिए यह मेरे लिए काम करता है। –

+0

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

+2

मैट, यह पूरी तरह से हिल गया। यह मुझे एक बड़ी मात्रा में काम बचाया! – drudru

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