Javascript 将选项传递给淘汰赛1.3中的模板

Javascript 将选项传递给淘汰赛1.3中的模板,javascript,knockout.js,templating,knockout-templating,Javascript,Knockout.js,Templating,Knockout Templating,在knockoutjs 1.2.1中,我可以做到: <div data-bind="template: {name: 'Bar', foreach: persons, templateOptions:{fooMode: true} }"/> <script id='Bar'> {{if $item.fooMode}} FOO! {{/if}} </script> {{if$item.fooMode}}FOO!{{/if} 我试着将其转换为淘汰赛

在knockoutjs 1.2.1中,我可以做到:

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

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

{{if$item.fooMode}}FOO!{{/if}
我试着将其转换为淘汰赛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


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

正如您所发现的,本机模板引擎不支持
templateOptions
,它是jQuery模板插件的
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;
    } 
}
以下是正在使用的示例:


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

我建议Sanderson的方案,您可以将新文本传递给包含模型和额外数据的模板数据(模板选项)

工作演示


来源

非常感谢。我有一种感觉,我可能会得到我想要的,但它会花我很长时间来弄清楚。谢谢,这对我帮助很大。虽然它最初不起作用,但我通过更改上下文。$data。$item到上下文。$templateOptions。请注意,选项($item)在第一次应用绑定后不会被传递-因为它们被删除了-这使得添加和修改元素变得不可用,非常棒的洞察力--救了我!非常好的,非clugy,自适应方法——Thx!
data-bind="template: { name: 'myTemplate', data: { model: $data, someOption: someValue } }"