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

标签 knockout.js

我遇到过几种情况,我必须像这样编写模板调用:

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

因为除了我的数据对象(例如 paginatedResults )之外,我还需要传递补充信息,例如用于渲染项目的模板名称。作为另一个示例,当呈现列表中的项目时,我可能需要知道过滤器的当前设置,该过滤器存储在逻辑上与列表中的项目相距甚远的某个上下文中。

不必扭曲我的数据模型(在上面的示例中,将 paginatedResults 替换为 {listContainer: paginatedResults, itemTemplate: $parent.template}} ,最好在模板上有一些语法允许我传递(并随着模板的分层评估而增加)深度嵌套的模板在渲染自身时可能需要的一些额外上下文。

我想我想知道的是向 ko.bindingHandlers 添加额外(可选)参数的可行性。函数( initupdate )使它们看起来像这样:
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 中引用的变量属性。

这有意义吗?我不太了解这将是多么难以实现。我想要担心的一件事是名称冲突,但一些命名​​约定可能会规避这一点。

基因

最佳答案

在不更改 Knockout 核心的情况下,我认为您能做的最好的事情就是创建一个与您当前正在传递的结构相似的包装绑定(bind)。

绑定(bind)可能如下所示:

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>

这是一个示例:http://jsfiddle.net/rniemeyer/QNvFn/

看起来您正在使用 native 模板,但如果您仍在使用 jQuery 模板,那么它确实包含了 templateOptions feature使用了options jQuery模板的特性来传递上下文数据。这在 native 模板中不可用。现在的一般建议是使用 $root , $parent , 和 $parents variables访问信息或将对象作为 data 传递以您在帖子中描述的方式。

关于knockout.js - 将参数传递给 KnockoutJS 模板的扩展语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8793460/

相关文章:

javascript - 未捕获的类型错误 : Cannot convert a Symbol value to a string

backbone.js - 离线使用 Backbone.js

javascript - knockout : Access to observable Variable outside of an custom component

knockout.js - 使用 knockout 更新 "placeholder"属性

javascript - 在与 Vue.js 相同的页面上使用 Knockout.js

javascript - knockout : editing data with easy rollback to previous value

javascript - 图像->JSON->.Net 图像

jquery - 在 Data-Bind 中使用 if 条件启用/禁用按钮? knockout

asp.net-mvc - 为什么我从 Knockout 提交的内容不能绑定(bind)到我的 MVC 模型

arrays - knockout 绑定(bind)内的 foreach 绑定(bind)(数组内的数组)