4

我正在尝试创建一个包含现有绑定的自定义绑定,即内置于 Knockout 中的“with”或“foreach”绑定。

不幸的是,这样做我收到以下错误:Uncaught TypeError: Cannot call method 'createChildContext' of undefinedfrom knockout-latest.debug.js:3060(该问题也出现在版本 2.1.0 上)。

我已经使用 Google Chrome 21.0.1180.57在 jsFiddle 上重现了异常。

自定义绑定简单定义如下:

ko.bindingHandlers.myWith = {
    init: function(element, valueAccessor, allBindings, viewModel) {
        // do things
        return ko.bindingHandlers.with.init(element, valueAccessor,
                                            allBindings, viewModel);
    },

    update: function(element, valueAccessor, allBindings, viewModel) {
        return ko.bindingHandlers.with.update(element, valueAccessor, 
                                              allBindings, viewModel); 
    }
};

人们希望能够使用上述表单中的简单处理程序“包装”现有绑定,就像本文中讨论的那样

4

1 回答 1

12

在 KO 2.0 中,绑定处理程序实际上接受了第 5 个参数,即绑定上下文。绑定上下文包含诸如$data, $parent, $parents,之类的东西$root

因此,您只需要转发该参数即可:

ko.bindingHandlers.myWith = {
    init: function(element, valueAccessor, allBindings, viewModel, context) {
        // do things
        return ko.bindingHandlers.with.init(element, valueAccessor,
                                            allBindings, viewModel, context);
    },

    update: function(element, valueAccessor, allBindings, viewModel, context) {
        return ko.bindingHandlers.with.update(element, valueAccessor, 
                                              allBindings, viewModel, context); 
    }
};

http://jsfiddle.net/rniemeyer/48uJg/2/

或者

ko.bindingHandlers.myWith = {
    init: function() {
        return ko.bindingHandlers.with.init.apply(this, arguments);
    },

    update: function() {
        return ko.bindingHandlers.with.update.apply(this, arguments);
    }
};
于 2012-08-08T16:28:24.337 回答