5

在 knockoutjs 1.2.1 中,我可以这样做:

<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。

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

4

2 回答 2

9

正如您所发现的,本机模板引擎不支持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;
    } 
}

这是一个正在使用的示例:http: //jsfiddle.net/rniemeyer/tFJuH/

请注意,在一个foreach场景中,您会发现您的选项$parent.$item不仅仅是$item.

于 2011-11-09T17:43:24.133 回答
8

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

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

工作演示http://jsfiddle.net/b9WWF/

来源https://github.com/knockout/knockout/issues/246#issuecomment-3775317

于 2014-03-07T09:22:54.170 回答