3

監視可能なオブジェクトの 1 つにサブスクライブ機能があります。サブスクライブ機能は、監視可能なオブジェクトに変更があった場合にのみ実行する必要があると思います。ただし、コードをトレースすると、初期化時に呼び出した後にコードが実行されていることがわかりko.applyBindings(MyViewModel);ます。

ビューモデルで得たものは次のとおりです。

function MyViewModel(myModel){
    this.myProperty = ko.observable(myModel.myProperty);

    this.myProperty .subscribe(function (val) {
        // do sth..
    }, this);
}

ここで applyBindings を呼び出します。

jQuery(document).ready(
    function ($) {
       ko.applyBindings(MyViewModel);
});

これは予期される動作ですか?

サブスクライブ関数は の直後に呼び出されko.applyBindings(MyViewModel);ています。つまり、その間 UI からの入力はありません。

myProperty の値が変更されるたびに、サブスクライブ関数本体のみを実行するようにしたいと思います。観測可能なオブジェクトを追跡して、変更がどこで発生しているかを確認する方法はありますか?

4

2 に答える 2

5

サブスクリプションを設定すると、ko.applyBindings() を呼び出したときにサブスクリプションが評価され、トリガーされます。

変更の追跡のみを見ている場合は、計算されたオブザーバブルを使用して同じ結果を得ることができます。以下に示す {deferEvaluation: true} オプションを追加することで、計算されたオブザーバブルが ko.applyBindings() で評価されるのを遅らせることができるようです。

例えば:

    function MyViewModel(myModel){
        this.myProperty = ko.observable('someValue');
        this.runCode = ko.computed(function (val) {
            // do some stuff any time this.myProperty() is changed
            console.log(this.myProperty());
        }, this, {deferEvaluation: true});
    }

var vm = new MyViewModel();

ko.applyBindings(vm);

vm.runCode();

vm.myProperty('some new value2');

これにより、評価時にコードが実行されるというデフォルトの動作が防止されます。イベントの追跡を開始するには、追跡を開始するときに計算された (この場合は vm.runCode()) を呼び出す必要があります。

動作を示す更新されたフィドルを次に示します: http://jsfiddle.net/amspianist/SL22M/2/

于 2013-12-13T02:45:34.453 に答える