2012-10-27 58 views
1

以下代碼的ko.computedname的大寫版本。用戶修改name,但計算出的可觀察值不跟蹤更改。knockout.js可觀察到的用戶操縱ko.computed的依賴關係

​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 

Here's所述的jsfiddle。

更新:看來這是故意給予this line。我的猜測是,它是爲了防止程序員意外地引發無限遞歸。

+1

是的,這是故意的。 –

回答

0

如果這被允許,它會創建一個循環依賴,導致無盡的重新計算。 'nameUpper'取決於'name'的值,並在每次'name'更改時重新計算。如果您訂閱您的計算機並不斷修改「名稱」,訂閱活動將繼續進行反饋。

+0

當然,但名稱仍應該更新。 –