2014-09-29 63 views
10

我有一個控制器和一個組件。當組件被渲染時,它以這種方式被傳遞:Ember組件是否可以觀察控制器屬性?

{{modal-filter feature=feature parentController=this.controller}} 

其中特點是,通過控制器傳遞到車把上的PARAM,和parentController是控制器。

現在,在控制器本身中,有一個屬性(一個數組)。讓我們調用該數組requiredValues。

現在控制器/組件本身,我們可以很容易地設置:

valueObserver : function(){ 
    ... 
}.observes('requiredValues') 

不過,我需要從一個模態過濾劑組分觀察該控制器屬性。因此,在模式過濾劑組分,會是什麼我把作爲觀察員功能:

valueObserver : function(){ 
    ... 
}.observes(???) 

回答

13

你不應該做什麼,但我會告訴你如何爲完整性

如果您在傳遞控制器中,您可以只在parentController屬性上看項目,雖然我不會推薦這個在所有

valueObserver : function(){ 
    ... 
}.observes('parentController.requiredValues') 

這將假設整個數組正在被替換,而不僅僅是一個項目添加或更改。

項目添加或刪除

valueObserver : function(){ 
    ... 
}.observes('parentController.requiredValues.[]') 

項目物業FOO改變了的requiredValues項目之一

valueObserver : function(){ 
    ... 
}.observes('[email protected]') 

你應該做的

而是通過在控制器中,只是通過在該物業,並觀察財產。

{{modal-filter feature=feature property=someProperty}} 


propertyObserver : Ember.observer('property', function(){ 
    ... 
}) 
+1

謝謝。這絕對有效,但我必須跟隨torazaburo的建議,因爲傳入控制器看起來像是一種代碼味道。然而,問題是'如何觀察控制器內的財產',所以這個答案在技術上是正確的。這也是正確的答案 - 它的工作原理。 – Darshan 2014-09-30 11:16:10

+0

您可以確定正在爲'observes('parentController.values。[]')案例添加/刪除的項目嗎? – eguneys 2015-05-02 18:06:43

+0

不使用這個,但你可以使用'addArrayObserver' http://emberjs.com/api/classes/Ember.Array.html#method_addArrayObserver – Kingpin2k 2015-05-03 06:14:47

20

將整個控制器傳遞給組件是一種巨大的代碼異味。它違反了組件封裝的基本原則。如果「組件」與控制器緊密耦合,則可以通過簡單地說this.controller來訪問控制器。組件的輸入應嚴格通過調用時傳入的參數。組件的輸出通過send,控制器可以通過說{{my-component action='eraseHardDisk'}}映射到其在視圖模板中選擇的某種行爲。

您不需要從組件內部直接觀察控制器上的任何內容。如果您使用{{my-component param=someProperty}}調用組件,則對控制器someProperty的任何更改將自動傳播到組件的param。組件然後可以在param上定義一些計算屬性,或者觀察它,或者在它自己的模板中使用它,它將自動保持最新。

+2

謝謝你讓我意識到這種代碼味道。我確實重構了我的代碼,只傳遞所需的數據作爲參數,並通過sendAction()函數發送輸出。你是對的 - 組件應該是獨立的;我在某個地方看到組件知道控制器,但控制器不知道組件,我誤解了它。謝謝;非常感激。 – Darshan 2014-09-30 11:18:54

+0

如果涉及基於Javascript的渲染,則綁定不起作用。 – Joe 2015-06-13 21:39:22