2013-09-27 41 views
12

我想在餘燼中構建一個模態框組件。模式框有兩個標準按鈕,「關閉」和「保存」。我想將控制器操作傳遞給此組件,以便在單擊保存按鈕時調用傳遞的控制器操作。我打電話給我的分量爲:將控制器對象綁定到餘燼中的一個組件

{{#affi-modal-box title="Test title" modalId="createNewAnalyticsRunModal" controllerBinding=controller}}some message{{/affi-modal-box}} 

和我的組件:

AS.AffiModalBoxComponent = Ember.Component.extend({ 
attributeBindings: ['modelId','test'], 
    //this is the function that gets called when save button is clicked 
    onSaveButtonClick : function(){ 

     console.log(this.controllerFor('analysisTemplates'));//fails 
     console.log(this.get('controller'));//returns modal box component which I don't need 
    } 

});

任何想法如何將控制器對象傳遞給組件?

謝謝。

回答

26

Ember.Component的工作方式與應用程序的其他部分無關,因此而不是傳遞一個控制器,在組件發生某些事情時需要調用某個動作,這樣做更像以這樣的方式

{{#affi-modal-box 
    title="Test title" 
    modalId="createNewAnalyticsRunModal" 
    action="actionNameOnTheController"}}some message{{/affi-modal-box}} 

正如你可以看到你設置控制器上的action屬性的動作名稱,然後你的組件裏,你只需撥打this.sendAction('action');這將觸發你前面定義的任何動作名稱:

AS.AffiModalBoxComponent = Ember.Component.extend({ 
    attributeBindings: ['modelId','test'], 
    //this is the function that gets called when save button is clicked 
    onSaveButtonClick : function(){ 
    this.sendAction('action'); 
    } 
}); 

所以,現在只要onSaveButtonClick被調用,它就會將動作actionNameOnTheController發送給正在收聽的任何控制器。最重要的是,對控制器一無所知。這是使Ember.Component以任何方式可重用的功能。

請看這裏的simple demo的概念解釋。

希望它有幫助。

+0

但是,如果您只是試圖從組件內更新控制器屬性,那麼您只需從該組件內重新分配該屬性的值,而將控制器屬性傳遞到組件的自動綁定將會處理更新,對吧?因此,對於簡單的控制器屬性更改,您不需要使用此主要操作方式。即使對於簡單的財產變化,它是更多的方式嗎? – ahnbizcad

+2

@ahnbizcad如果您要將組件與控制器緊密結合,您甚至可以不使用組件。組件的目的是爲了重用性而去耦。所以這個組件是用作爲鉤子的動作構建的。根據組件被放入的位置,這些操作可以觸發不同的控制器操作,以執行在該上下文中最有用的操作。這有道理嗎? – Misterparker

+0

@intuitivepixel我們可以通過這個解決方案傳遞參數嗎? – murli2308

相關問題