Javascript 如何使用子上下文可访问的自定义属性扩展模板绑定语法?

Javascript 如何使用子上下文可访问的自定义属性扩展模板绑定语法?,javascript,data-binding,knockout.js,templating,Javascript,Data Binding,Knockout.js,Templating,我试图找到一种简单而优雅的方法来扩展模板绑定,以便将自定义属性传播到子上下文中。通过extend,我的意思是使用带有附加属性的模板绑定,而不是创建另一个将控制后代绑定(ControlsDescentBindings)的绑定,因为它需要另一个DOM元素或虚拟元素 这就是我想要实现的目标: 或 …使用以下各项的任何变化: ... 请注意,视图模型由2个元素共享,因此我不是在问如何更改视图模型属性/可观察对象。相反,我想知道是否有一种机制可以扩展本机模板绑定语法,以便在子上下文中提供自定义

我试图找到一种简单而优雅的方法来扩展模板绑定,以便将自定义属性传播到子上下文中。通过extend,我的意思是使用带有附加属性的模板绑定,而不是创建另一个将控制后代绑定(ControlsDescentBindings)的绑定,因为它需要另一个DOM元素或虚拟元素

这就是我想要实现的目标:



…使用以下各项的任何变化:


...
请注意,视图模型由2个
元素共享,因此我不是在问如何更改视图模型属性/可观察对象。相反,我想知道是否有一种机制可以扩展本机
模板
绑定语法,以便在子上下文中提供自定义属性

我已经阅读了一些关于扩展上下文的文档或解决方法,但找不到不需要额外HTML标记的解决方案:

目前,我正在使用上一个链接中建议的虚拟绑定处理程序:

ko.bindingHandlers.let = {
    init : function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        // Make a modified binding context, with extra properties, and apply it to descendant elements
        var innerContext = bindingContext.extend(valueAccessor());
        ko.applyBindingsToDescendants(innerContext, element);

        return { controlsDescendantBindings: true };
    }
};
ko.virtualElements.allowedBindings['let'] = true;
…以这种方式应用:



它按预期工作,但看起来有点冗长

非常感谢

这个问题最初是在这里提出的:

如果您使用以下sintax,我找到了一个解决方案:

<div class="row" data-bind="propertyTemplate: {
     name: 'column-template',
     foreach: items1,
     properties: { columnType: 'col-md-6' }
 }"></div>

可能已经太晚了,但我知道这可能会帮助其他人

基本思想是保留原始绑定处理程序,并用新的绑定处理程序替换它,同时使用保留的绑定处理程序调用原始功能

其背后的主要思想是:

var originalHandler = ko.bindingHandlers['handler'];
var customHandler = {
    extendBindingContext: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
        // extend here
        // bindingContext = bindingContext.extend(...);
        return bindingContext;
    },
    init: originalHandler.init
        ? function (element, valueAccessor, allBindings, viewModel, bindingContext) {
            bindingContext = customHandler
                .extendBindingContext(element, valueAccessor, allBindings, viewModel, bindingContext);
            return originalHandler.init(element, valueAccessor, allBindings, viewModel, bindingContext);
        }
        : undefined,
    update: originalHandler.update
        ? function (element, valueAccessor, allBindings, viewModel, bindingContext) {
            bindingContext = customHandler
                .extendBindingContext(element, valueAccessor, allBindings, viewModel, bindingContext);
            return originalHandler.update(element, valueAccessor, allBindings, viewModel, bindingContext);
        }
        : undefined
};
ko.bindingHandlers['handler'] = customHandler;

希望这有帮助-不要忘记投票,甚至对成功或问题发表评论-点击几下就可以了;P

感谢您的贡献,但正如我在问题中所述,我正在寻找一种“扩展本机模板绑定语法的机制”,而不是如何在另一个自定义绑定处理程序中包装本机模板绑定。有什么区别??结果不一样吗??为什么要“扩展本机模板绑定语法”,而围绕现有绑定进行包装是行不通的?可能是因为stackoverflow.com已经成为一个会员关心其声誉评分而不是关注问题的地方……;)
var originalHandler = ko.bindingHandlers['handler'];
var customHandler = {
    extendBindingContext: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
        // extend here
        // bindingContext = bindingContext.extend(...);
        return bindingContext;
    },
    init: originalHandler.init
        ? function (element, valueAccessor, allBindings, viewModel, bindingContext) {
            bindingContext = customHandler
                .extendBindingContext(element, valueAccessor, allBindings, viewModel, bindingContext);
            return originalHandler.init(element, valueAccessor, allBindings, viewModel, bindingContext);
        }
        : undefined,
    update: originalHandler.update
        ? function (element, valueAccessor, allBindings, viewModel, bindingContext) {
            bindingContext = customHandler
                .extendBindingContext(element, valueAccessor, allBindings, viewModel, bindingContext);
            return originalHandler.update(element, valueAccessor, allBindings, viewModel, bindingContext);
        }
        : undefined
};
ko.bindingHandlers['handler'] = customHandler;