我正在将HTML注入页面。然后我调用applyBindings()。 在某些情况下,我绑定了尚不存在的viewmodel属性。有没有办法拦截单个绑定,因为它们是由applyBindings()创建的,所以我可以创建缺少的属性??
答案 0 :(得分:1)
您需要实现自定义绑定提供程序。
由于Michael Best的评论,我正在更新这部分答案。
如果您正在为KO 2实施它,绑定提供程序如下所示:
var customBindingProvider = {
nodeHasBindings: function(node) {
// return true if the node has bindings, usually if it has
// data-bind attributes
},
getBindings: function(node, bindingContext) {
// return a binding object, like this:
// { boundPropertyName: bindingContext.$data.boundValue }
}
};
在KO 3中,此实现存在向后兼容性,但已弃用。新实施应实施getBindingAccessors
而不是getBindings
。该函数不是返回具有属性和绑定值的对象,而是必须返回具有属性和值访问器的对象,这些函数返回绑定值,如下所示:
getBindingAccessors: function(node, bindingContext) {
// return a binding object, like this:
// { boundPropertyName: valueAccessorFunction }
}
此处有更多信息:What is the difference between bindingProvider.getBindings and bindingProvider.getBindingAccessors?
在这两种情况下,绑定提供程序都以这种方式注册:
ko.bindingProvider.instance = customBindingProvider;
您可以在getBindings
中修改视图模型,您可以使用bindingContext
参数访问它。要完全了解其工作原理,请阅读blog post on custom binding providers,其实施位于https://github.com/rniemeyer/knockout-classBindingProvider。
您可以在注册自定义提供程序之前存储原始绑定提供程序,以便在修改上下文后可以访问原始功能。
另一个有趣的bindig提供者示例:Knockout and Custom Binding Providers