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 に答える