拦截applyBindings以创建viewmodel observable

时间:2015-11-24 21:38:20

标签: knockout.js

我正在将HTML注入页面。然后我调用applyBindings()。 在某些情况下,我绑定了尚不存在的viewmodel属性。有没有办法拦截单个绑定,因为它们是由applyBindings()创建的,所以我可以创建缺少的属性??

1 个答案:

答案 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

另一个在SO:Knockout js lots of custom bindings