淘汰JS更新颜色

时间:2012-05-14 19:16:52

标签: knockout.js

我正在使用Knockout observable来更新表格单元格中的跨度值。当新值与旧值不同时,我需要更改表格单元格的背景颜色。当我订阅observable时,我似乎无法在更新期间访问旧值。有没有办法获得旧的价值?我计划使用带有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);

1 个答案:

答案 0 :(得分:3)

Knockout 2.0增加了将主题订阅到可观察对象的能力。 “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,以便能够为计算和正常的可观察对象执行此操作。

您可以使用它:

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

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