2012-01-17 21 views
40

पर बाइंडिंग लागू किए गए हैं या नहीं, यह जांचने का कोई तरीका है कि applyBindings को पृष्ठ क्षेत्र के लिए बुलाया गया है या नहीं?नॉकआउट: यह जांचने के लिए कि पृष्ठ क्षेत्र

ऐसा लगता है कि applyBindings एक ही पृष्ठ पर एक से अधिक बार कॉल किया जाता है जब यह नॉकआउट पसंद नहीं करता है।

उत्तर

59

नॉकआउट 2.0 में दो कार्य हैं जिनका आप इस उद्देश्य के लिए उपयोग कर सकते हैं। ko.dataFor और ko.contextFor एक नोड में लेने के लिए और या तो नॉकआउट डेटा है कि कि गुंजाइश (contextFor) है, जो $data, $parent, $parents, और $root शामिल पर कि गुंजाइश (dataFor) या पूरे बंधन संदर्भ में बांधने के लिए यह करने के लिए उपलब्ध होगा लौटने।

तो, आप की तरह कुछ कर सकते हैं: http://jsfiddle.net/rniemeyer/GaqGY/

हालांकि, एक सामान्य स्थिति में आप वास्तव में ko.applyBindings अपने पृष्ठ पर एक ही समय कॉल करने के लिए दिखना चाहिए:

var isBound = function(id) { 
    return !!ko.dataFor(document.getElementById(id)); 
}; 

यहां एक नमूना है। यह इस बात पर निर्भर करता है कि आप क्या हासिल करने की कोशिश कर रहे हैं। एकाधिक दृश्य मॉडल प्रबंधित करने के तरीकों पर कुछ सुझावों के लिए इस उत्तर पर एक नज़र डालें: Example of knockoutjs pattern for multi-view applications

आमतौर पर, आप <div data-bind="with: mySubModel"> करेंगे और जब mySubModel पॉप्युलेट हो जाता है तो वह क्षेत्र दिखाई देगा और बाध्य होगा।

+0

शानदार उत्तर। धन्यवाद। – Chin

+0

हाय, @ आरपीएन, उपरोक्त आईबाउंड फ़ंक्शन पूरी तरह से सुरक्षित नहीं है। ऐसा इसलिए है क्योंकि केओ के बाद खुद को unbinds ko.dataFor (...) संग्रहीत डेटा को वापस जारी रखता है। यह पहेली देखें: http://jsfiddle.net/nabog/6hCfM/6/ –

+1

@ नोएल अब्राहम - वास्तव में उस मामले में नॉकआउट वास्तव में "अनबिंड" नहीं होता है। यह पहचानता है कि तत्व दस्तावेज का हिस्सा नहीं है और गणना किए गए अवलोकन योग्य का उपयोग नहीं करता है जिसका प्रयोग तत्व की बाइंडिंग की निर्भरताओं को ट्रैक करने के लिए किया जाता है। इसका मतलब है कि बाध्यकारी आगे अपडेट नहीं होगा, लेकिन यह नहीं कि यह अनबाउंड है। यदि आप वास्तव में किसी तत्व से केओ को हटाना चाहते हैं, तो आपको 'ko.cleanNode' को कॉल करने की आवश्यकता है जो इसे अपने डेटा को स्ट्रिप करेगा (हालांकि यह किसी भी ईवेंट हैंडलर को नहीं हटाएगा)। यहां एक नमूना है: http://jsfiddle.net/rniemeyer/6hCfM/7/ –

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