Frage Erhalten Sie den vorherigen Wert eines beobachtbaren Objekts in demselben Beobachtungsobjekt


Ist es im Knock-out möglich, den aktuellen Wert eines beobachtbaren Objekts innerhalb eines Abonnements auf dieses Observable zu bekommen, bevor es 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
});

74
2017-10-10 15:25


Ursprung


Antworten:


Es gibt eine Möglichkeit, den Vorher-Wert wie folgt zu abonnieren:

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

80
2017-10-10 16:24



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 das obige wie folgt:

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

});

138
2017-08-12 09:49



Kleine Änderung an Beagle90 Antwort. Geben Sie das Abonnement immer selbst zurück, um beispielsweise auf die Methode 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;
};

19
2017-12-22 09:35



Das Pull-Anfrage Um diese Funktion hinzuzufügen, gibt es einen anderen Code, der besser ist als die Verwendung des beforeChange Veranstaltung.

Alles Gute für die Lösung Michael Beste 

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:

Ich habe ursprünglich vorgeschlagen, zu verwenden beforeChange um dieses Problem zu lösen, aber haben seitdem erkannt, dass es nicht immer zuverlässig ist (zum Beispiel, wenn Sie anrufen valueHasMutated() auf dem Observablen).


13
2018-03-05 23:55



Ich habe gefunden, dass ich peek () von einer beschreibbaren berechneten Observablen aufrufen kann, um den Vorher-Wert zu erhalten.

So etwas (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
2018-04-08 15:36