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 avalueHasMutated()
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) {
});