

[Knockout.jsのカスタムバインディング](http://kojs.sukobuto.com/docs/custom-
bindings)を作っています。

例えば`data-bind="MyBind: { value: vmCode, size: vmLength
}"`のようなバインディングができるとして、`MyBind`カスタムバインディングの`update`メソッドが、`value(vmCode)`の変更によって呼ばれたのか、`size(vmLength)`の変更によって呼ばれたのか、区別したいです。

そのための手段はあるでしょうか？


CC BY-SA 3.0
2018-02-16T05:55:46.333
41768
2018-02-21T15:42:37.220
2018-02-21T07:30:57.810
8078
8078
question
javascript knockout.js
Knockout.jsのカスタムバインディングでupdateが呼ばれた原因を特定したい


単純に直前の値をどこかに記憶しておけば比較できると思います。

[code]

    ko.bindingHandlers.MyBind={  
        update: function (element, valueAccessor) {
    
            // バインディングの現在の値を取得する
            var obj = ko.unwrap(valueAccessor());
            var value = ko.unwrap(obj.value);
            var size = ko.unwrap(obj.size);
    
            // 前回保存した値を取得する
            var p = element.__MyBindPreviousValue;
    
            // TODO: 現在値と前回の値を使って処理をする
            element.innerText = `${value}, ${size} <= (${p ? p.value : ''}, ${p ? p.size : ''})`;
    
            // 今回の値を適当な場所に保存する
            // ここでは単純にelementに値を設定している
            element.__MyBindPreviousValue = { value: value, size: size };
        } 
    };
    
[/code]

なお`Observable`に対しては`obj.value.subscribe(function(){})`のようにリスナーを登録することも出来ます。VM内でちょっとした処理をするのであればこれで十分ですが、質問の場合は監視対象が複合オブジェクトであるため`subscribe`で明示的に管理すると煩雑になるでしょう。


CC BY-SA 3.0
2018-02-21T15:42:37.220
41900
2018-02-21T15:42:37.220
5750
41768
answer