2014-01-14 64 views
1

我有一個應用程序與許多類似的意見,我編程實例化「幹」我的應用程序。 問題是控制器以編程方式實例化不進一步委託actions散列中的動作。這很明顯,因爲控制器無法從中推導出層次結構。然而,應該有辦法告訴控制器它必須使用哪個父控制器來進行事件冒泡。有人知道嗎?以編程方式創建控制器委託(泡泡)事件

回答

2

你不應該自己初始化控制器。所有的控制器初始化應該由Ember自己處理。另一個有趣的記錄,控制器的目的是在應用程序中的單身人士。當循環訪問ArrayController時,唯一的例外是itemController。你可以閱讀更多關於它in the guides。從導遊報價:

在Ember.js應用程序,你會始終指定你的控制器作爲 類和框架,負責實例他們 它們提供給您的模板。

這使測試您的控制器非常簡單,並確保您的整個應用程序共享一個控制器的單個實例。

更新1:

如何執行路由爲一個嚮導的示例:

App.Router.map(function() { 
    this.resource('wizard', function() { 
    this.route('step1'); 
    this.route('step2'); 
    this.route('step3'); 
    }); 
}); 

這種方式,可以有一個單獨的控制器/視圖/每的步驟模板嚮導。如果您在轉換到下一個步驟之前應完成每個步驟的完成程度的邏輯,則可以在單個路徑中處理該步驟。

更新2:

在該步驟的數量不是預先確定的,而是基於該數據被饋送到該應用的情況下,可以使一個WizardController即一個ArrayController其中每個項目在陣列中是嚮導中的一個步驟。然後,使用lookupItemController勾上ArrayController,有點像這樣:

App.WizardRoute = Ember.Route.extend({ 
    model: function() { 
    return [ 
     {controllerName: 'step1', templateName: 'step1'}, 
     {controllerName: 'step2', templateName: 'step2'}, 
     {controllerName: 'step3', templateName: 'step3'} 
    ]; 
    } 
}); 


App.WizardController = Ember.ArrayController.extend({ 
    lookupItemController: function(modelObject) { 
    return modelObject.controllerName; 
    } 
}); 

{{#each step in controller}} 
    {{view Ember.View templateName=step.templateName}} 
{{/each}} 

至於另一個,可能會更好,或者,也可以在那裏你拉低模式,爲未來覆蓋路由的renderTemplate鉤步驟在嚮導中,並在渲染調用中傳遞適當的templateName和控制器,有點像你see here

問題是,我認爲應該可以做到這一點,而無需自己實例化控制器。

+0

理論上,從架構的角度來看,你是對的,但我認爲我的應用程序足夠複雜,我可以想到沒有更好的方法。另一種方法是大規模代碼重複。我將其用於嚮導組件,其中嚮導中的每個步驟都是不同的,因此需要不同的控制器/視圖。該組件本身用於實現具有不同步驟的許多不同的嚮導。 – vanthome

+0

我可以想到處理這個問題的幾種不同的方法,這些方法都停留在ember約定的領域。我在通過ember路由工作的Ember應用中構建了一個嚮導,假設嚮導中的步驟具有一定的確定性,這非常合適。我不能在我的評論中放置代碼示例,因此我會更新我的答案以包含代碼示例。 – Adam

+0

雖然這確實起作用,但我的嚮導組件並不需要定義每個步驟。我有一個動態段的路由,並且一個步驟的視圖/控制器是通過命名約定動態確定的。 與往常一樣,任何解決方案都有其優缺點,不想進一步討論。 – vanthome