Knockout.js - 无法包装'with','foreach'和其他模板绑定

Bri*_*unt 4 knockout-2.0 knockout.js

我正在尝试创建一个包装现有绑定的自定义绑定,即Knockout中内置的"with"或"foreach"绑定.

不幸的是,这样做我得到以下错误:Uncaught TypeError: Cannot call method 'createChildContext' of undefined来自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); 
    }
};
Run Code Online (Sandbox Code Playgroud)

人们可以期望能够使用上面的表单中的简单处理程序"包装"现有绑定,就像本文中讨论的那样.

RP *_*yer 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); 
    }
};
Run Code Online (Sandbox Code Playgroud)

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);
    }
};
Run Code Online (Sandbox Code Playgroud)