2012-06-15 73 views
5

當我使用Ember路由器時,如何定義連接到控制器的模板中的動作?Ember.js路由器對控制器的動作

一個例子是在這裏: http://jsfiddle.net/KvJ38/3/

的Unter我的個人資料有兩個動作: 一是在國家規定,並正在 二是在控制器上定義。我如何使這個工作,或者我應該使用另一種方法?

App.Router = Em.Router.extend({ 
    enableLogging: true, 
    location: 'hash', 

    root: Em.State.extend({ 
    // EVENTS 
    goHome: Ember.State.transitionTo('home'), 
    viewProfile: Ember.State.transitionTo('profile'), 

    // STATES 
    home: Em.State.extend({ 
     route: '/', 
     connectOutlets: function(router, context) { 
     var appController = router.get('applicationController'); 
     appController.connectOutlet(App.HomeView); 
     } 
    }), 

    // STATES 
    profile: Em.State.extend({ 
     route: '/profile', 
     connectOutlets: function(router, context) { 
      var appController = router.get('applicationController'); 
      appController.connectOutlet(App.ProfileView); 
     } 
    }), 

    one: function() { 
     alert("eins"); 
    }, 
    }) 
}); 

回答

12

行動的默認目標是路由器,但可以定義另一個模板:

{{action two target="controller"}} 

而在「App.ProfileController」添加「二」的功能。

UPDATE

這個答案是正確的希望2012年中期現在(2014年9月),該文件說:

默認情況下,{{action}}幫手觸發模板的控制器上的方法。 [...]如果控制器沒有在動作對象中實現與動作同名的方法,則動作將被髮送到路由器,在該路由器中,當前活動的葉子路徑將有機會處理動作。 [...]如果模板的控制器和當前活動的路由都不實現處理程序,則該操作將繼續冒泡到任何父路由。最終,如果定義了ApplicationRoute,它將有機會處理該操作。當一個動作被觸發,但是在控制器,當前路由或任何當前路由的祖先上未實現匹配的動作處理程序時,將會拋出錯誤。

+1

謝謝。這裏是工作解決方案:http://jsfiddle.net/KvJ38/4/ – Lux

+1

其實,一個動作的默認目標是包含控制器,然後是路由器。下面是一個示例jsbin,顯示控制器在控制器和路由上定義時處理動作:http://emberjs.jsbin.com/tupil/3/edit。以下是關於操作的燼文檔:http://emberjs.com/guides/templates/actions/ – bantic

+0

從文檔:「默認情況下,{{動作}}助手觸發模板控制器上的方法」http:/ /emberjs.com/guides/templates/actions/#toc_action-bubbling – fmendez

4

如@Stéphane所述,您可以明確指定目標屬性,以便將操作發送到別處。

如果未指定,操作助手的目標是controller.target。正如你所說,這通常設置到路由器。

如果您有一個想要使默認目標不同的模板,可以通過設置控制器的目標屬性來實現。例如,要將目標設置爲控制器本身:

App.MyController = Ember.Controller.extend({ 
    init: function(){ 
    this._super(); 
    this.set('target', this); 
    }; 
}); 
+0

也爲冒泡行動處理,而序列說...電流控制器,然後當前路線,然後其他活動路線......這是否意味着對於父母,只有路線有機會處理(而不是controllers.ie父控制器)? – testndtv