2012-06-15 45 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