Czy w knockout można uzyskać bieżącą wartość obserwowalnego w ramach subskrypcji tego obserwowalnego, zanim otrzyma nową wartość?
Przykład:
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
źródło
źródło
this
tu oznacza?ko.subscribable.fn.subscribeChanged = function (callback) { var oldValue; this.subscribe(function (_oldValue) { oldValue = _oldValue; }, this, 'beforeChange'); this.subscribe(function (newValue) { callback(newValue, oldValue); }); };
Użyj powyższego w ten sposób:
MyViewModel.MyObservableProperty.subscribeChanged(function (newValue, oldValue) { });
źródło
dispose()
funkcją gist.github.com/30ff1f5c1adf215179b0046515f86e45Niewielka zmiana w odpowiedzi Beagle90. Zawsze zwracaj samą subskrypcję, aby na przykład mieć dostęp do metody dispose ().
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; };
źródło
.dispose
wartości zwracanej z tego spowoduje usunięcie tylko drugiej subskrypcji, a nie'beforeChange'
subskrypcjiWniosek wyciągnąć , aby dodać tę funkcję ma jakiś inny kod, który nakręca bycia lepszym niż polegać na użyciu
beforeChange
zdarzenia.Wszystko dzięki rozwiązaniu Michaelowi Bestowi
ko.subscribable.fn.subscribeChanged = function (callback) { var savedValue = this.peek(); return this.subscribe(function (latestValue) { var oldValue = savedValue; savedValue = latestValue; callback(latestValue, oldValue); }); };
Cytując Michaela:
źródło
Odkryłem, że mogę wywołać funkcję peek () z zapisywalnego, obliczonego obserwowalnego, aby uzyskać poprzednią wartość.
Coś takiego (patrz 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); } });
źródło
peek()
otrzymasz nową wartość.subscribe
wywołaniu zwrotnym, czego nie można zrobić za pomocą peek (). Twój przykład niczego nie udowadnia i może zmylić nowo przybyłego. Zasadniczo zawijasz tutaj zmienną prywatną i wyświetlasz jej wartość przed jej ustawieniem - więc oczywiście się nie zmieni.