2012-02-08 21 views
2

我有結構是這樣的模式:即使我沒有指定它的依賴關係,爲什麼計算的屬性被更新?

App = {}; 

App.Outer = Ember.Object.extend({ 
    inner: null, 
    quantity: 0, 

    count: function() { 
     var self = this, inner = self.get('inner'); 
     return self.get('quantity') * inner.get('count'); 
    }.property('nothing') 
}); 

App.Inner = Ember.Object.extend({ 
    count: 0 
}); 

是,「計數」計算性能真的被設置爲依賴於一個完全不存在的屬性「無」。但它似乎無論如何得到更新:

var o1 = App.Outer.create({ 
    quantity: 2, 
    inner: App.Inner.create({count: 4}) 
}); 

console.log(o1.get('count')); // => 8 
o1.get('inner').set('count', 5); 
console.log(o1.get('count')); // => 10 
o1.set('inner', App.Inner.create({count: 10})); 
console.log(o1.get('count')); // => 20 

我錯過了什麼嗎?它知道如果沒有我告訴它要依靠什麼更新......不對,可以嗎?我對Ember計算屬性有什麼誤解?

感謝

+0

注意,'.property( '無')'相當於這裏'.property()'---可能簡化這個問題。 – 2012-02-10 14:04:50

回答

7

通過使用this.get('quantity')inner.get('count')你告訴它什麼它取決於。每次您撥打.get('count')時,該功能都會關閉並獲取這些屬性的當前值,並因此返回最新的結果。

.property()部分在將計算的屬性計數綁定到其他內容時發揮作用,例如一個看法。當你這樣做時,更改數量將自動重新計算計數,並且這個新值將傳播到你綁定計數的任何地方。

你可以看到在這裏的行動的區別:)http://jsfiddle.net/tomwhatmore/6gz8x/

+0

完美的感覺,謝謝。如果我想從單元測試中測試這種行爲,應該如何繼續?我猜想做一個臨時的視圖對象,並綁定到該屬性,然後檢查其綁定的屬性更改時綁定到一個更改... – 2012-02-09 18:29:52

+0

@AsfandYarQazi我不得不承認,我仍然在制定出測試Ember的最佳方法項目,關於這個話題沒有太多的文檔,所以我在過去幾天一直在嘗試一些不同的東西。這個具體的例子雖然讓我覺得不適合單元測試,但你基本上只是測試框架,而不是代碼。 Ember已經有很多測試。我認爲它將作爲集成測試的一部分得到更好的覆蓋。 – 2012-02-09 19:58:44

3

由於灰燼0.9.5,屬性值不會被緩存,除非緩存(被稱爲他們。例如

... 

count: function() { 
    var self = this, inner = self.get('inner'); 
    return self.get('quantity') * inner.get('count'); 
}.property('nothing').cacheable() 

... 

更多的背景,請參閱本GitHub的問題的討論:https://github.com/emberjs/ember.js/issues/38

+0

是的,但在這種情況下,我想知道爲什麼它的行爲就像它被緩存:) – 2012-02-09 18:29:02

+0

@AsfandYarQazi我創建了一個JSFiddle來試圖更好地展示緩存如何適應:http://jsfiddle.net/pNC8t/ 您可以將屬性依賴關係視爲「訂閱」。你說我想知道這個屬性何時改變。綁定使用它來知道是否更新。 「可緩存」功能使用它來知道是重新執行該函數還是隻返回與上次運行時相同的結果。 – 2012-02-10 13:59:30

+0

@AsfandYarQazi另一個需要解釋清楚:當你使用'.property('foo')',你說這個函數是一個屬性,並在'foo'發生變化時通知我。綁定是訂閱的另一種形式。對於更新屬性更改的綁定,您必須具有從更改屬性到綁定的訂閱鏈。最後,'cacheable'可以讓你說不要再次執行這個函數,除非我收到通知我所依賴的東西已經改變了。 – 2012-02-10 14:09:32

相關問題