Получить Предыдущее значение наблюдаемого в подписке того же наблюдаемого
возможно ли в нокауте получить текущее значение наблюдаемого в подписке на это наблюдаемое, прежде чем оно получит новое значение?
пример:
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
});
5 ответов:
есть способ сделать подписку на значение before следующим образом:
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");
ko.subscribable.fn.subscribeChanged = function (callback) { var oldValue; this.subscribe(function (_oldValue) { oldValue = _oldValue; }, this, 'beforeChange'); this.subscribe(function (newValue) { callback(newValue, oldValue); }); };
использовать, как это:
MyViewModel.MyObservableProperty.subscribeChanged(function (newValue, oldValue) { });
небольшое изменение для ответа Beagle90. Всегда возвращайте саму подписку, чтобы иметь доступ к 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; };
The pull-запрос для добавления этой функции есть несколько другой код, который оказывается лучше, чем полагаться на использование
beforeChange
событие.все заслуги за решение Майкл Лучший
ko.subscribable.fn.subscribeChanged = function (callback) { var savedValue = this.peek(); return this.subscribe(function (latestValue) { var oldValue = savedValue; savedValue = latestValue; callback(latestValue, oldValue); }); };
цитирую Майкла:
Я изначально предложил использовать
beforeChange
чтобы решить эту проблему, но с тех пор понял, что это не всегда надежной (например, если вы называетеvalueHasMutated()
на наблюдаемых).
Я обнаружил, что могу вызвать peek() из записываемого вычисляемого наблюдаемого, чтобы получить значение before.
что-то вроде этого (см. 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); } });