2

Knockout オブザーバブルを使用して、テーブル セル内にあるスパン値を更新しています。新しい値が古い値と異なる場合、テーブル セルの背景色を変更する必要があります。オブザーバブルをサブスクライブすると、更新中に古い値にアクセスできないようです。古い値を取得する方法はありますか? 観察可能な状態の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 では、トピックをオブザーバブルにサブスクライブする機能が追加されました。「beforeChange」トピックは、以前の値を提供します。

これにより、オブザーバブルを拡張して、古い値と新しい値の両方をコールバックに提供するサブスクリプションを追加できます。

次のようになります。

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/

于 2012-05-14T20:27:49.123 に答える