tutorial knockoutjs knockout example book knockout.js knockout-2.0 observable

knockout.js - knockoutjs - ko observable



Obtener el valor anterior de un observable en suscripciĆ³n de lo mismo observable (5)

Hay una manera de hacer una suscripción al valor anterior de esta manera:

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

¿Es posible en caso de nocaut obtener el valor actual de un observable dentro de una suscripción a ese observable, antes de que reciba el nuevo valor?

Ejemplo:

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


He descubierto que puedo llamar a peek () desde un observable calculado escribible para obtener el valor anterior.

Algo como esto (ver 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); } });


La github.com/knockout/knockout/issues/914 para agregar esta característica tiene un código diferente que termina siendo mejor que confiar en el uso del evento beforeChange .

Todo el crédito por la solución a 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); }); };

Para citar a Michael:

Originalmente sugerí utilizar beforeChange para resolver este problema, pero desde entonces me di cuenta de que no siempre es confiable (por ejemplo, si llamas a valueHasMutated() en el observable).


Poco cambio a la respuesta Beagle90. Siempre devuelva la suscripción para poder acceder al dispose (), por ejemplo.

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


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

Utilice lo anterior de esta manera:

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