2

我正在使用 Knockout observables 来更新位于表格单元格内的跨度值。当新值与旧值不同时,我需要更改表格单元格的背景颜色。似乎当我订阅 observable 时,我在更新期间无法访问旧值。有没有办法获得旧值?我计划使用带有可观察状态的 css 绑定来更新表格单元格背景。

<td data-bind="css: { tempIncreased: tempState() > 0 }">
    <span data-bind="text: temp"></span>
</td>

在视图模型中:

   this.temp.subscribe(function (newValue) {
        var old = this.temp();
        if (newValue > old) {
            this.tempState = 1;
        }
        else {
            this.tempState = 0;
        }
    }, this);
4

1 回答 1

3

Knockout 2.0 增加了订阅 observables 的功能。“beforeChange”主题将为您提供之前的值。

有了这个,你可以扩展 observables 来添加一个订阅,为回调提供旧值和新值。

它可能看起来像:

ko.observable.fn.beforeAndAfterSubscribe = function(callback, target) {
    var _oldValue;
    this.subscribe(function(oldValue) {
        _oldValue = oldValue;
    }, null, 'beforeChange');

    this.subscribe(function(newValue) {
        callback.call(target, _oldValue, newValue);
    });
};

您可以将此函数添加到ko.subscribable.fn而不是ko.observable.fn能够为计算的和普通的 observables 执行此操作。

你会这样使用:

this.temp.beforeAndAfterSubscribe(function (oldValue, newValue) {
    if (newValue > oldValue) {
        this.tempState = 1;
    }
    else {
        this.tempState = 0;
    }
}, this);

这是一个示例:http: //jsfiddle.net/rniemeyer/QDbUk/

于 2012-05-14T20:27:49.123 回答