2011-11-09 133 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> 

我已经试过翻译淘汰赛1.3.0beta作为

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

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

但新的本地模板引擎不尊重templateOptions。

有没有其他方法可以将任意数据传递到模板中?

回答

8

正如您发现的,本地模板引擎不支持templateOptions,它是jQuery Template插件的options功能的封装。

您可以使用的两种方法: 将数据放在您的视图模型上,并在模板中使用$root.fooMode$parent.fooMode。这将是最简单的选择。

否则,如果你不希望在您的视图模型中的价值,那么你可以使用自定义绑定操作上下文,如:

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; 
    } 
} 

这里是使用一个样本:http://jsfiddle.net/rniemeyer/tFJuH/

请注意,在foreach方案中,您可以在$parent.$item上找到您的选项,而不仅仅是$item

+0

非常感谢。我有一种感觉,绑定手柄可能会让我想到我想要的地方,但要花费很长时间才能弄清楚。 – Greg

+0

谢谢,这对我帮助很大。虽然它最初并没有工作,但我通过改变context。$ data。$ item到上下文。$ templateOptions来代替它。 – Stuntbeaver

+0

请注意,在第一次应用绑定后,选项($ item)不会被传递 - 因为它们被删除 - 这使得添加和修改元素不可用 –