1

次のコードにko.computedは、 の大文字バージョンである がありますname。サブスクライバーは を変更nameしますが、計算されたオブザーバブルは変更を追跡しません。

​var ViewModel = function() {
    this.name = ko.observable("Brad");
    this.nameUpper = ko.computed(function() {
        return this.name().toUpperCase();
    }, this);
};

var model = new ViewModel();
model.nameUpper.subscribe(function(newValue) {
    console.log('nameUpper changed to ' + newValue);
    this.name("Chris");
}, model);​​​

console.log('nameUpper = ' + model.nameUpper());
model.name("Stevie");
console.log('nameUpper = ' + model.nameUpper());

期待される出力:

nameUpper = BRAD
nameUpper changed to STEVIE
nameUpper = CHRIS

実際の出力:

nameUpper = BRAD
nameUpper changed to STEVIE
nameUpper = STEVIE

これがjsfiddleです。

更新:この行を考えると、これは意図的なものと思われます。私の推測では、プログラマーが誤って無限再帰を誘発するのを防ぐためだと思います。

4

1 に答える 1

0

これが許可されると、循環依存が作成され、無限の再計算が発生します。「nameUpper」は「name」の値に依存し、「name」が変更されるたびに再計算されます。計算されたものをサブスクライブして「名前」を変更し続けると、サブスクライブイベントは再起動し続けます。

于 2012-10-27T17:29:24.280 に答える