Knockout.js 将参数传递给KnockoutJS模板的扩展语法

Knockout.js 将参数传递给KnockoutJS模板的扩展语法,knockout.js,Knockout.js,我遇到过几种情况,在这些情况下,我必须对模板调用进行如下编码: <!-- ko template: {name: 'paginatedList', data: {listContainer: paginatedResults, itemTemplate: $parent.template}} --> <!-- /ko --> function (element, valueAccessor,

我遇到过几种情况,在这些情况下,我必须对模板调用进行如下编码:

<!-- ko template: {name: 'paginatedList', 
                   data: {listContainer: paginatedResults, itemTemplate: $parent.template}} --> 
<!-- /ko -->
function (element, 
          valueAccessor, 
          allBindingsAccessor, 
          viewModel, 
          bindingContext, 
          context)
当编写上述示例时,我应该能够说

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

或者更好

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

并使
itemTemplate
成为我可以在嵌套模板和
data bind
属性中引用的变量

这有意义吗?我不太清楚这将有多难实现。我想有一件事需要担心的是名称冲突,但一些命名约定可能会绕过这一点


Gene

在不改变敲除核心的情况下,我认为最好的方法是使用包装器绑定,创建与当前传递的结构类似的结构

绑定可能看起来像:

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);
    } 
};   
你可以这样称呼它:

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

以下是一个示例:


看起来您使用的是本机模板,但是如果仍然使用jQuery模板,那么它确实包含了一个
templateOptions
,它使用jQuery模板的
options
功能来传递上下文数据。这在本机模板中不可用。现在的一般建议是使用
$root
$parent
$parents
以您在文章中描述的方式访问信息或将对象作为
数据传递。

谢谢!我同意它做了一些正确的事情,但不足以保证额外的绑定处理程序。看看这种模式在复杂的应用程序中出现的频率会很有趣。谢谢,它帮了我很多忙。如果我写了一个模板包装器,我可以在
init
中设置模板名称吗?@tbruyelle-你绝对可以设置名称。这样做的想法是,在包装器绑定中构建要传递给实际模板绑定的选项。下面是一个可能比您需要的更通用的示例(您可以在valueAccessor()对象上设置名称):这可能不是您发布的正确链接。看起来和我的一样。谢谢你的示例,我也找到了一个解决方案,代码比你的解决方案少,但我不知道是否更好。