webentwicklung-frage-antwort-db.com.de

Holen Sie sich den vorherigen Wert eines Observablen in subscribe desselben Observablen

Ist es beim Knockout möglich, den aktuellen Wert einer Beobachtungsgröße innerhalb einer Subskription für diese Beobachtungsgröße abzurufen, bevor sie den neuen Wert erhält?

Beispiel:

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

Es gibt eine Möglichkeit, ein Abonnement für den vorherigen Wert wie folgt zu erstellen:

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);
    });
};

Verwenden Sie die oben genannten wie folgt:

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

});
147
JBeagle

Kleine Änderung zu Beagle90 Antwort. Geben Sie das Abonnement immer selbst zurück, um beispielsweise auf dispose () zugreifen zu können.

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

Das Pull Request zum Hinzufügen dieser Funktion hat einen anderen Code, der besser ist als die Verwendung des beforeChange -Ereignisses.

Alle Kredite für die Lösung an 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);
    });
};

Um Michael zu zitieren:

Ursprünglich habe ich vorgeschlagen, beforeChange zu verwenden, um dieses Problem zu lösen. In der Zwischenzeit habe ich jedoch festgestellt, dass dies nicht immer zuverlässig ist (zum Beispiel, wenn Sie valueHasMutated() für das Observable aufrufen).

16
James Johnson

Ich habe festgestellt, dass ich peek () von einem beschreibbaren berechneten Observable aufrufen kann, um den Vorher-Wert zu erhalten.

So ähnlich (siehe 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