2012-02-13 9 views
17

जब आप ko.applyBinding(viewModel, "divId") पर कॉल करते हैं तो यह नॉकआउट का उपयोग करते हुए, यह आपके द्वारा बाध्य तत्व ("divId") के बच्चों के माध्यम से एक पुनरावर्ती बाध्यकारी करता है। मैं इस मूल्यांकन को एक बच्चे नोड पर रोकना चाहता हूं। क्या इसे करने का कोई तरीका है?बाल तत्वों पर मूल्यांकन करने वाले knockout.js बाइंडिंग को कैसे रोकें

कारण है कि ...

मैं एक नेविगेशन दृश्य मॉडल के लिए पूरे पृष्ठ बाध्य करने के लिए चाहते हैं, यह मूल लेआउट संभाल लेंगे और ... मुस्कान ... नेविगेशन। विभिन्न पृष्ठों पर मैं कुछ क्षेत्रों को अलग-अलग दृश्य मॉडल में बांधना चाहता हूं जो नेविगेशन व्यू मॉडल के गुण नहीं हैं। फिलहाल अगर मैं ऐसा करता हूं तो मुझे "बाध्यकारी पार्स करने में असमर्थ" त्रुटियां मिलती हैं क्योंकि नेविगेशन व्यू मॉडल में आवश्यक गुण नहीं हैं। अगर मैं डोम के नीचे बाध्यकारी बंद कर सकता था, तो मैं इन वस्तुओं को अलग से बांध सकता था।

उत्तर

35

ऐसे कई तरीके है कि आप इस पर जा सकते हैं कर रहे हैं। आम तौर पर, आप मुख्य दृश्य मॉडल में कई "उप" दृश्य मॉडल जोड़ देंगे और फिर with का उपयोग उन क्षेत्रों के साथ बाध्यकारी करेंगे जिनके वास्तविक दृश्य मॉडल उनके खिलाफ बाध्य हैं।

तकनीकी रूप से ऐसा करना संभव है जो आप कर रहे हैं। आप एक कस्टम बाध्यकारी बना सकते हैं जो केओ को बताता है कि यह बच्चों को बाध्यकारी बनाएगा। यह इस तरह दिखेगा:

ko.bindingHandlers.stopBindings = { 
    init: function() { 
     return { controlsDescendantBindings: true }; 
    } 
}; 

जब आप इसे किसी तत्व पर रखते हैं, तो केओ बच्चों को अनदेखा कर देगा। फिर, आप एक अलग दृश्य मॉडल के साथ इस तत्व के बच्चे पर ko.apply बाइंडिंग को कॉल कर सकते हैं।

नमूना: http://jsfiddle.net/rniemeyer/tWJxh/

आमतौर पर हालांकि, आप with बंधन का उपयोग कर एक मुख्य दृश्य मॉडल के नीचे कई दृश्य मॉडल का प्रयोग करेंगे।

+1

उत्कृष्ट सामान, वही जो मैं चाहता था। मेरा परिदृश्य सामान्य नहीं हो सकता है लेकिन यह मुझे एक वास्तविक मॉड्यूल आधारित लोडिंग दृष्टिकोण देता है जहां प्रत्येक मॉड्यूल सभी अन्य लोगों से स्वतंत्र होता है, परीक्षण मजेदार बनाता है ... –

+0

यह बाइंडिंग को रोकने के लिए बस एक अतिरिक्त कंटेनर के उपयोग को मजबूर करता है; क्या कंटेनर-कम (टिप्पणी) नोड्स को कस्टम बाध्यकारी हैंडलर जैसे उपर्युक्त स्टॉप बाइंडिंग का समर्थन करना आसान होगा? यह अत्यधिक मॉड्यूलर ऐप्स में उपयोगी होगा :) – AlexG

+0

2.1 (आरसी में), कंटेनर-कम कस्टम बाइंडिंग हैंडलर संभव होंगे: http://jsfiddle.net/rniemeyer/75yQD/। तो, यह कोई समस्या नहीं होगी। 2.0 में, 'ko.virtualElements.allowedBindings' का खुलासा नहीं किया गया था। –

3

एक तरीका मैंने यह किया है नेविगेशन (या केवल ए) के लिए एक अनुभाग बनाना और उस पर navVM बांधना है। फिर सामग्री के लिए एक और अनुभाग बनाएं और इसे contentVM को बाध्य करें। इस तरह कोई संघर्ष नहीं है और यह सब बहुत अलग है।

<body> 
    <div id="navSection"> 
    </div> 
    <div id="contentSection"> 
    </div> 
</body> 

फिर ko.applyBinding (navVM, "navSection") और ko.applyBinding (contentVM, "contentSection") कर

+0

mmm ... करुणा दो अलग बाध्यकारी संदर्भों को बनाना आसान नहीं है जो एक ही उपट्री –

+1

में हैं, आप इसे "कर सकते हैं" (रयान का नोट देखें), मैं बस इतना कह रहा था कि यह सोचने के लिए और अधिक संरचित हो सकता है आपके घटकों को अपने स्वयं के ढीले युग्मित मॉड्यूल के रूप में। –

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