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