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