2012-07-17 56 views
52

當使用淘汰賽,什麼是使用只讀觀測計算,而不是簡單的功能的優勢呢?淘汰賽:計算觀察到VS功能

看看下面的視圖模型構造和HTML片段,例如:這裏

var ViewModel = function(){ 
    var self = this; 
    self.someProperty = ko.observable("abc"); 
    self.anotherProperty = ko.observable("xyz"); 
    self.someComputedProperty = function(){ 
     return self.someProperty() + self.anotherProperty(); 
    };  
}; 

<input data-bind="value: someProperty"/> 
<input data-bind="value: anotherProperty"/> 
<p data-bind="text: someComputedProperty()"></p> 

似乎一切都如你所期望的工作,所以是有原因,我應該使用:

​var ViewModel = function(){ 
    var self = this; 
    self.someProperty = ko.observable("abc"); 
    self.anotherProperty = ko.observable("xyz"); 
    self.someComputedProperty = ko.computed(function(){ 
     return self.someProperty() + self.anotherProperty(); 
    });  
}; 


<input data-bind="value: someProperty"/> 
<input data-bind="value: anotherProperty"/> 
<p data-bind="text: someComputedProperty"></p> 

我注意到,在http://knockoutjs.com/documentation/computedObservables.html文檔指出「......聲明綁定簡單地計算觀測實施」,這是否意味着有需要我在我的ViewModels明確地使用它們?

回答

71

如果你的計算觀察到的唯一目的是做一個簡單的綁定反對它,然後使用功能將是等效的。綁定在計算的observable內部實現以跟蹤依賴關係,因此當任何可觀察對象發生更改時,綁定都會重新觸發綁定。

下面是要考慮有關計算觀測與功能

  • 的一個計算觀察到的緩存值的幾件事情,所以創建,並在依賴被更新時,它纔會更新。對於常規函數,每次都需要執行邏輯。如果很多事情都依賴於這個值(比如說集合中的每個項目都與來自父項的值綁定),那麼這個邏輯將會一次又一次地運行。

  • 在JavaScript中,您也可以免費使用計算觀測就像使用其他觀測。這意味着您可以針對它們創建手動訂閱,並依賴其他計算機(調用函數也會創建此依賴性)。你可以依靠KO正常實用方法,如ko.utils.unwrapObservable一般地確定是否需要將其作爲調用一個函數或不檢索值。

  • 如果您最終想要將值發送到服務器,則計算出的observable將自然出現在您的JSON輸出中,而正常函數的結果值在轉換爲JSON時會消失(您會有首先做更多的工作來填充該功能的屬性)。

+0

大回答:謝謝! – Duncan 2012-07-17 19:04:31

+1

很好的答案。當我想要每次執行完整的邏輯時,我有時會使用函數而不是計算。 – 2012-07-17 22:06:22

+1

它是如何知道一個計算的觀察值取決於另一個可觀察值,當我通過它時是一個函數?它是否解析該功能!? - 時間來讀取淘汰賽的源代碼我猜 – zod 2013-10-10 15:06:17