2011-12-13 21 views
0

我正在玩knockoutjs和他們的樣本,我被編輯過的原始碼位在下面。將fullName屬性指定爲dependentObservable,並且此方法明確知道fullName方法內的哪些依賴關係,因此fullName方法僅在依賴項更改時才起作用。ko.dependentObservable這個方法如何巧妙地理解依賴關係?

如果我從fullName方法中刪除this.LastName(),所以更改lastName屬性不會導致調用fullName方法。

我想知道這是怎麼回事。

var viewModel = { 
    firstName: ko.observable("Bert"), 
    lastName: ko.observable("Bertington") 
}; 

viewModel.fullName = ko.dependentObservable(function() { 
    alert('worked'); 
    return this.firstName() + " "+ this.lastName() ; 
}, viewModel); 


// Activates knockout.js 
ko.applyBindings(viewModel); 

回答

4

Knockout中有依賴關係跟蹤機制,用於評估dependentObservables。關鍵是訪問一個observable必須通過一個函數(你必須調用this.firstName())。除了返回firstName之外,Knockout還將dependentObservable作爲訂戶添加到firstName。當firstName被更新時(它也必須經過該功能),然後通知所有用戶。

此外,每次評估dependentObservable時,都會重新評估這些依賴關係,因此依賴關係實際上可以隨着時間對dependentObservable進行更改。

+0

我覺得這種行爲非常危險,因爲並不是所有的依賴關係都可以被評估。想想一個計算的布爾屬性,其計算結果類似於「return @ dependent1()|| @ dependent2()」。如果@ dependent1()在第一次評估中爲true,則KO無法知道計算出的屬性還應跟蹤@ dependent2更改。在我看來,應該有另一種更明確的方式來設置依賴關係。 – rosenfeld 2013-09-20 19:11:09