Ember.js 路由器操作到控制器

6
当我使用Ember Router时,如何在模板中定义与控制器连接的操作?
以下是一个示例: http://jsfiddle.net/KvJ38/3/ 在“我的个人资料”下有两个操作: 一个在状态上定义,并且有效 第二个在控制器上定义。我该如何使其有效或者应该使用另一种方法?
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");
    },
  }) 
});
3个回答

13

动作的默认目标是路由器,但您可以在模板中定义另一个目标:

{{action two target="controller"}}

在"App.ProfileController"中添加一个“two”函数。

更新

这个答案在2012年中期可能是正确的。现在(2014年9月),文档说:

默认情况下,{{action}} 辅助函数会在模板的控制器上触发一个方法。 [...] 如果控制器没有在其 actions 对象中实现与 action 同名的方法,则该 action 将被发送到路由器,在其中当前活动的叶子路由将有机会处理该 action。[...] 如果模板的控制器和当前活动路由都没有实现处理程序,则该 action 将继续向任何父级路由泡沫。最终,如果定义了 ApplicationRoute,它将有机会处理该 action。当触发一个 action 时,但是控制器、当前路由或当前路由的任何祖先上都没有匹配的 action 处理程序时,将抛出错误。


1
实际上,动作的默认目标是包含控制器,然后是路由器。这里有一个示例jsbin,显示当控制器和路由上都定义了动作时,控制器处理该动作:http://emberjs.jsbin.com/tupil/3/edit。这是关于动作的Ember文档:http://emberjs.com/guides/templates/actions/。 - bantic
从文档中得知:"默认情况下,{{action}}助手会在模板的控制器上触发一个方法"。http://emberjs.com/guides/templates/actions/#toc_action-bubbling - fmendez
1
@bantic 你说得对。自2012年以来,Ember.js已经发生了很大的变化,我的回答不再正确。现在已经更新了。谢谢! - Stéphane Blond

4

您可以明确指定目标属性,如@Stéphane所指出的那样,以便将操作发送到其他地方。

如果未指定,则动作助手的目标是controller.target。 正如您所注意到的那样,这通常设置为路由器。

如果您有一个模板,在该模板中您想要默认目标不同,您可以通过设置控制器的目标属性来实现。例如,将目标设置为控制器本身:

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

对于冒泡操作处理,当序列为...当前控制器,然后是当前路由和其他活动路由...这是否意味着对于父级,只有路由有机会处理(而不是控制器,即父级控制器)? - copenndthagen

0

谢谢。这个链接很有用! 但是,View 是什么情况?为什么 View 不是默认目标? http://jsfiddle.net/KvJ38/9/ - Lux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接