在订阅相同的observable中获取observable的先前值

Kod*_*hor 83 observable knockout-2.0 knockout.js

在获得新值之前,是否可以在knockout中获取可观察的可观察量的当前值?

例:

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
});
Run Code Online (Sandbox Code Playgroud)

JBe*_*gle 147

ko.subscribable.fn.subscribeChanged = function (callback) {
    var oldValue;
    this.subscribe(function (_oldValue) {
        oldValue = _oldValue;
    }, this, 'beforeChange');

    this.subscribe(function (newValue) {
        callback(newValue, oldValue);
    });
};
Run Code Online (Sandbox Code Playgroud)

使用上面这样:

MyViewModel.MyObservableProperty.subscribeChanged(function (newValue, oldValue) {

});
Run Code Online (Sandbox Code Playgroud)

  • 这很酷,你提出拉动请求吗? (13认同)
  • 淘汰相当新,但我希望这是默认订阅设置的方式.或者......这个fn至少会刮我的第一次痒,因为我第一次使用'subscribe'. (2认同)
  • 如果订阅的 observable 值类型是数组,则必须对其进行切片,否则 oldValue 将始终与 newValue 相同。检查一个工作示例,在这里:https://jsfiddle.net/david_freire/xmk6u9yn/4/ (2认同)

RP *_*yer 87

有一种方法可以像这样订阅之前的值:

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");
Run Code Online (Sandbox Code Playgroud)


And*_*ies 21

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;
};
Run Code Online (Sandbox Code Playgroud)

  • 这是一个真正的进步,但是在返回值上调用 `.dispose` 只会处理第二个订阅,而不是 `'beforeChange'` 订阅 (2认同)

Jam*_*son 18

添加此功能的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);
    });
};
Run Code Online (Sandbox Code Playgroud)

引用迈克尔:

我最初建议beforeChange用来解决这个问题,但后来意识到它并不总是可靠的(例如,如果你调用valueHasMutated()了observable).