web-dev-qa-db-ja.com

同じオブザーバブルのサブスクライブでオブザーバブルの以前の値を取得する

ノックアウトでは、新しい値を受け取る前に、オブザーバブルのサブスクリプション内でオブザーバブルの現在の値を取得することはできますか?

例:

this.myObservable = ko.observable();
this.myObservable.subscribe(function(newValue){
    //I'd like to get the previous value of 'myObservable' here before it's set to newValue
});
83
KodeKreachor

次のようにbefore値へのサブスクリプションを行う方法があります。

this.myObservable = ko.observable();
this.myObservable.subscribe(function(previousValue){
    //I'd like to get the previous value of 'myObservable' here before it's set to newValue
}, this, "beforeChange");
87
RP Niemeyer
ko.subscribable.fn.subscribeChanged = function (callback) {
    var oldValue;
    this.subscribe(function (_oldValue) {
        oldValue = _oldValue;
    }, this, 'beforeChange');

    this.subscribe(function (newValue) {
        callback(newValue, oldValue);
    });
};

次のように上記を使用します。

MyViewModel.MyObservableProperty.subscribeChanged(function (newValue, oldValue) {

});
147
JBeagle

Beagle90の回答にほとんど変更はありません。たとえば、dispose()にアクセスできるように、サブスクリプション自体を常に返します。

ko.subscribable.fn.subscribeChanged = function (callback) {
    var oldValue;
    this.subscribe(function (_oldValue) {
        oldValue = _oldValue;
    }, this, 'beforeChange');

    var subscription = this.subscribe(function (newValue) {
        callback(newValue, oldValue);
    });

    // always return subscription
    return subscription;
};
20
Andries

この機能を追加する プルリクエスト には、beforeChangeイベントの使用に依存するよりも優れたコードがいくつかあります。

Michael Best に対するソリューションのすべての功績

_ko.subscribable.fn.subscribeChanged = function (callback) {
    var savedValue = this.peek();
    return this.subscribe(function (latestValue) {
        var oldValue = savedValue;
        savedValue = latestValue;
        callback(latestValue, oldValue);
    });
};
_

マイケルを引用するには:

もともとbeforeChangeを使用してこの問題を解決することを提案しましたが、それが常に信頼できるとは限らないことに気付きました(たとえば、observableでvalueHasMutated()を呼び出す場合)。

16
James Johnson

Before値を取得するために、書き込み可能な計算可能オブザーバブルからpeek()を呼び出すことができることがわかりました。

このようなもの( http://jsfiddle.net/4MUWp を参照):

var enclosedObservable = ko.observable();
this.myObservable = ko.computed({
    read: enclosedObservable,
    write: function (newValue) {
        var oldValue = enclosedObservable.peek();
        alert(oldValue);
        enclosedObservable(newValue);
    }
});
3
rjmunro