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


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

пример:

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 76

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