¿Es posible en el 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
});
knockout.js
knockout-2.0
observable
KodeKreachor
fuente
fuente
this
significa aquí?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 así:
MyViewModel.MyObservableProperty.subscribeChanged(function (newValue, oldValue) { });
fuente
dispose()
función gist.github.com/30ff1f5c1adf215179b0046515f86e45Pequeños cambios en la respuesta de Beagle90. Devuelva siempre la propia suscripción para poder acceder a 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; };
fuente
.dispose
el valor de retorno de esto solo eliminará la segunda suscripción, no la'beforeChange'
suscripciónLa solicitud de extracción para agregar esta función tiene un código diferente que termina siendo mejor que confiar en el uso del
beforeChange
evento.Todo el mérito de 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:
fuente
Descubrí que puedo llamar a peek () desde un observable calculado que se puede escribir para obtener el valor anterior.
Algo como esto (consulte 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); } });
fuente
peek()
lo tanto, le dará el nuevo valor.subscribe
devolución de llamada que no se puede hacer con peek (). Su ejemplo no prueba nada y podría confundir a un recién llegado. Básicamente, está ajustando una variable privada aquí y muestra su valor antes de configurarla, por lo que, por supuesto, no habrá cambiado.