É possível obter no knockout o valor atual de um observável dentro de uma assinatura desse observável, antes de receber o novo valor?
Exemplo:
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
fonte
fonte
this
significa aqui?ko.subscribable.fn.subscribeChanged = function (callback) { var oldValue; this.subscribe(function (_oldValue) { oldValue = _oldValue; }, this, 'beforeChange'); this.subscribe(function (newValue) { callback(newValue, oldValue); }); };
Use o acima assim:
MyViewModel.MyObservableProperty.subscribeChanged(function (newValue, oldValue) { });
fonte
dispose()
função gist.github.com/30ff1f5c1adf215179b0046515f86e45Uma pequena mudança na resposta do Beagle90. Sempre retorne a própria assinatura para poder acessar o dispose (), por exemplo.
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; };
fonte
.dispose
o valor de retorno disso descartará apenas a segunda assinatura, não a'beforeChange'
assinaturaA solicitação pull para adicionar esse recurso tem algum código diferente que acaba sendo melhor do que depender do uso do
beforeChange
evento.Todo o crédito pela solução para 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 Michael:
fonte
Descobri que posso chamar peek () de um observável computado gravável para obter o valor anterior.
Algo assim (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); } });
fonte
peek()
, fornecerá o novo valor.subscribe
retorno de chamada que não pode ser feito com peek (). Seu exemplo não prova nada e pode confundir um recém-chegado. Você basicamente está encapsulando uma variável privada aqui e exibe seu valor antes de defini-la - então é claro que não terá mudado.