Подтвердить что ты не робот

Получить предыдущее значение наблюдаемого в подписке того же наблюдаемого

Можно ли в нокауте получить текущее значение наблюдаемого в пределах подписки на наблюдаемое, прежде чем оно получит новое значение?

Пример:

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
});
4b9b3361

Ответ 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);
    }
});