2011-11-09 14 views
5

में टेम्पलेट्स के लिए पासिंग विकल्पों knockoutjs 1.2.1 में मैं कर सकता है:नॉकआउट 1.3

<div data-bind="template: {name: 'Bar', foreach: persons, templateOptions:{fooMode: true} }"/> 

<script id='Bar'> 
    {{if $item.fooMode}} FOO! {{/if}} 
</script> 

कौन सा मैं कोशिश की है के रूप में

<div data-bind="template: {name: 'Bar', foreach: persons, templateOptions:{fooMode: true} }"/> 

<script id='Bar'> 
    <span data-bind="if: $item.fooMode">FOO!</span> 
</script> 

लेकिन नए देशी टेम्पलेट 1.3.0beta पीटकर करने का अनुवाद करने में इंजन टेम्पलेट विकल्प का सम्मान नहीं करता है।

क्या कोई अन्य तरीका है कि मैं टेम्पलेट में मनमानी डेटा पास कर सकता हूं?

उत्तर

8

जैसा कि आपने पाया, मूल टेम्पलेट इंजन templateOptions का समर्थन नहीं करता है जो jQuery टेम्पलेट प्लग-इन options कार्यक्षमता के लिए एक रैपर था।

दो तरीकों से आप जा सकते हैं: अपने डेटा को अपने दृश्य मॉडल पर रखें और अपने टेम्पलेट के अंदर $root.fooMode या $parent.fooMode का उपयोग करें। यह सबसे आसान विकल्प होगा। http://jsfiddle.net/rniemeyer/tFJuH/

:

ko.bindingHandlers.templateWithOptions = { 
    init: ko.bindingHandlers.template.init, 
    update: function(element, valueAccessor, allBindingsAccessor, viewModel, context) { 
     var options = ko.utils.unwrapObservable(valueAccessor()); 
     //if options were passed attach them to $data 
     if (options.templateOptions) { 
      context.$data.$item = ko.utils.unwrapObservable(options.templateOptions); 
     } 
     //call actual template binding 
     ko.bindingHandlers.template.update(element, valueAccessor, allBindingsAccessor, viewModel, context); 
     //clean up 
     delete context.$data.$item; 
    } 
} 

यहाँ उपयोग में एक नमूना है:

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

ध्यान दें कि foreach परिदृश्य में, आपको $parent.$item पर $item के बजाय अपने विकल्प मिलेंगे।

+0

धन्यवाद बहुत बहुत। मुझे एहसास हुआ कि बाध्यकारी हैंडलर मुझे वह जगह ले सकते हैं जहां मैं चाहता था, लेकिन मुझे इसे समझने में काफी समय लगेगा। – Greg

+0

धन्यवाद, इससे मुझे बहुत मदद मिली। यद्यपि यह प्रारंभ में काम नहीं करता था, लेकिन मुझे संदर्भ बदलकर यह मिल गया। $ डेटा। संदर्भ के लिए $ आइटम। $ टेम्पलेट इसके बजाय विकल्प। – Stuntbeaver

+0

ध्यान दें कि पहली बार बाइंडिंग लागू करने के बाद विकल्प ($ आइटम) पारित नहीं होते हैं - क्योंकि वे हटाए जाते हैं - जो तत्वों को जोड़ने और संशोधित करने योग्य बनाता है –

7

मैं सैंडर्सन के प्रस्ताव का सुझाव दूंगा जहां आप नए शाब्दिक टेम्पलेट डेटा को पास करेंगे जिसमें मॉडल और अतिरिक्त डेटा (टेम्पलेट विकल्प) शामिल हैं।

data-bind="template: { name: 'myTemplate', data: { model: $data, someOption: someValue } }" 

कार्य डेमो http://jsfiddle.net/b9WWF/

स्रोत https://github.com/knockout/knockout/issues/246#issuecomment-3775317

+0

वोकोज़, बहुत ही भयानक अंतर्दृष्टि - मुझे बचाया! बहुत अच्छा, गैर-चिपचिपा, अनुकूली दृष्टिकोण - Thx! – Cody