Возможно ли в нокауте получить текущее значение наблюдаемого в подписке на этот наблюдаемый объект до того, как он получит новое значение?
Пример:
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
источник
источник
this
означает?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) { });
источник
dispose()
функцией gist.github.com/30ff1f5c1adf215179b0046515f86e45Небольшое изменение в ответе 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; };
источник
.dispose
возвращаемого значения приведет к'beforeChange'
В запросе на добавление этой функции есть другой код, который оказывается лучше, чем полагаться на использование
beforeChange
события.Вся заслуга Майкла Беста за решение
ko.subscribable.fn.subscribeChanged = function (callback) { var savedValue = this.peek(); return this.subscribe(function (latestValue) { var oldValue = savedValue; savedValue = latestValue; callback(latestValue, oldValue); }); };
Процитирую Майкла:
источник
Я обнаружил, что могу вызвать peek () из записываемого вычисляемого наблюдаемого, чтобы получить значение до.
Примерно так (см. 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); } });
источник
peek()
вы получите новое значение.subscribe
обратном вызове, чего нельзя сделать с помощью peek (). Ваш пример ничего не доказывает и может запутать новичка. По сути, вы обертываете здесь частную переменную и отображаете ее значение перед ее установкой - поэтому, конечно, оно не изменится.