2012-01-09 22 views
7

मैं जिसमें मैं इस तरह मेरे टेम्पलेट कॉल कोड करने के लिए है कई स्थितियों सामने आने वाले:विस्तारित वाक्य रचना

<!-- ko template: {name: 'paginatedList', 
        data: {listContainer: paginatedResults, itemTemplate: $parent.template}} --> 
<!-- /ko --> 

क्योंकि मेरे डेटा वस्तु के अलावा (जैसे, paginatedResults), मैं प्रतिपादन वस्तुओं में उपयोग करने के लिए टेम्पलेट के नाम जैसे पूरक जानकारी में पास करने की आवश्यकता है। एक और उदाहरण के रूप में, किसी सूची में किसी आइटम को प्रतिपादित करते समय, मुझे किसी फ़िल्टर में वर्तमान फ़िल्टर को दूर से हटाए गए किसी संदर्भ में संग्रहीत फ़िल्टर की वर्तमान सेटिंग्स को जानने की आवश्यकता हो सकती है।

बल्कि (मेरे डेटा मॉडल बिगड़ना ऊपर के उदाहरण में हो रही है, {listContainer: paginatedResults, itemTemplate: $parent.template}} साथ paginatedResults की जगह की तुलना में, यह मेरे चारों ओर पारित करने के लिए अनुमति देता है कि टेम्पलेट्स पर वाक्य रचना का एक सा है (और acccrue के लिए अच्छा के रूप में टेम्पलेट्स पदानुक्रम मूल्यांकन किया जाता है होगा) कुछ अतिरिक्त संदर्भ है कि एक गहरा-नेस्टेड टेम्पलेट जब खुद प्रतिपादन आवश्यकता हो सकती है।

मुझे लगता है कि मैं क्या के बारे में सोच उन्हें की तरह लग रहे बनाने के लिए ko.bindingHandlers कार्य (init और update) के लिए एक अतिरिक्त (वैकल्पिक) पैरामीटर जोड़ने की व्यवहार्यता है यह:

function (element, 
      valueAccessor, 
      allBindingsAccessor, 
      viewModel, 
      bindingContext, 
      context) 

जब ऊपर के उदाहरण कोडिंग, मैं

<!-- ko template: {name: 'paginatedList', 
        data: paginatedResults, 
        itemTemplate: $parent.template} --> 
<!-- /ko --> 

और itemTemplate की तरह कुछ

<!-- ko template: {name: 'paginatedList', 
        data: paginatedResults, 
        context: {itemTemplate: $parent.template}} --> 
<!-- /ko --> 

या बेहतर अभी तक, एक चर मैं नेस्टेड टेम्पलेट्स और data-bind में उल्लेख कर सकते हैं बन कहने के लिए सक्षम होना चाहिए जिम्मेदार बताते हैं।

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

जीन

उत्तर

9

परिवर्तन कोर नॉकआउट के लिए बिना, मुझे लगता है कि सबसे अच्छा है कि तुम कर सकते हो एक आवरण बाध्यकारी है कि एक संरचना क्या आप वर्तमान में गुजर रहे हैं के समान बनाता है।

बाइंडिंग लग सकता है जैसे:

<div data-bind="templateWithContext: { name: 'itemsTmpl', data: items, context: { title: 'First' } }"></div> 

यहाँ एक नमूना है:

ko.bindingHandlers.templateWithContext = { 
    init: ko.bindingHandlers.template.init, 
    update: function(element, valueAccessor, allBindings, data, context) { 
     var options = ko.utils.unwrapObservable(valueAccessor()); 

     ko.utils.extend(context, options.context); 

     return ko.bindingHandlers.template.update.apply(this, arguments); 
    } 
}; 

आप इसे पसंद कहेंगे http://jsfiddle.net/rniemeyer/QNvFn/

ऐसा लगता है कि देशी टेम्पलेट का उपयोग कर रहे हैं की तरह है, लेकिन अगर आप अभी भी jQuery टेम्पलेट्स का उपयोग कर रहे हैं, फिर इसमें templateOptionsfeature शामिल था जो jQuery टेम्पलेट्स की options सुविधा का उपयोग करता था संदर्भ डेटा पास करने के लिए। यह देशी टेम्पलेट्स में उपलब्ध नहीं है। सामान्य सिफारिश अब $root, $parent, और $parentsvariables का उपयोग करने के लिए या किसी ऑब्जेक्ट को data के रूप में आपके पोस्ट में वर्णित तरीके से पास करने के लिए उपयोग करना है।

+0

धन्यवाद! मैं मानता हूं कि यह सही चीज करता है, लेकिन एक अतिरिक्त बाध्यकारी हैंडलर वारंट करने के लिए पर्याप्त नहीं है। जटिल अनुप्रयोगों में यह पैटर्न कितनी बार आता है यह देखना दिलचस्प होगा। –

+0

धन्यवाद यह मुझे बहुत मदद करता है।यदि मैं एक टेम्पलेट रैपर लिखता हूं, तो क्या मैं 'init' के अंदर टेम्पलेट नाम सेट कर सकता हूं? – tbruyelle

+0

@tbruyelle - आप निश्चित रूप से नाम सेट कर सकते हैं। विचार यह होगा कि आपके रैपर बाध्यकारी के अंदर आप उन विकल्पों को बनाते हैं जिन्हें आप वास्तविक टेम्पलेट बाध्यकारी में पास करना चाहते हैं। यहां एक नमूना है जो आपको आवश्यकतानुसार थोड़ा अधिक सामान्य हो सकता है (आप केवल valueAccessor() ऑब्जेक्ट पर नाम सेट कर सकते हैं): http://jsfiddle.net/rniemeyer/7rcFD/ –

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