Получить предыдущее значение наблюдаемого в подписке того же наблюдаемого
Можно ли в нокауте получить текущее значение наблюдаемого в пределах подписки на наблюдаемое, прежде чем оно получит новое значение?
Пример:
this.myObservable = ko.observable();
this.myObservable.subscribe(function(newValue){
//I'd like to get the previous value of 'myObservable' here before it set to newValue
});
Ответы
Ответ 1
Существует способ сделать подписку на значение до следующего:
this.myObservable = ko.observable();
this.myObservable.subscribe(function(previousValue){
//I'd like to get the previous value of 'myObservable' here before it set to newValue
}, this, "beforeChange");
Ответ 2
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) {
});
Ответ 3
Небольшое изменение в ответе Beagle90. Всегда возвращайте подписку, чтобы иметь возможность обращаться к утилите(), например.
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;
};
Ответ 4
тянуть запрос, чтобы добавить эту функцию, имеет другой код, который заканчивается лучше, чем полагаться на событие beforeChange
.
Все кредиты за решение 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);
});
};
Процитировать Майкла:
Первоначально я предложил использовать beforeChange
для решения этой проблемы, но с тех пор понял, что он не всегда надежный (например, если вы вызываете valueHasMutated()
на наблюдаемое).
Ответ 5
Я обнаружил, что могу вызвать 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);
}
});