1

以下代码有一个ko.computed大写版本的name. 订阅者修改name,但计算出的 observable 不跟踪更改。

​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 回答