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()对象上设置名称):这可能不是您发布的正确链接。看起来和我的一样。谢谢你的示例,我也找到了一个解决方案,代码比你的解决方案少,但我不知道是否更好。