Ember.js路由器行动控制器(Ember.js Router Action to Control

2019-06-25 12:41发布

当我使用灰烬路由器,我怎么能在模板中定义谁是连接到控制器的动作?

一个例子是在这里: 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");
    },
  }) 
});

Answer 1:

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

{{action two target="controller"}}

而在“App.ProfileController”添加“二”的功能。

UPDATE

这个答案是正确的希望2012年中期现在(2014年9月),该文件说:

默认情况下, {{action}}帮手触发模板的控制器上的方法。 [...]如果控制器没有实现具有相同名称的方法作为其行动的操作对象,该操作将被发送到路由器,在当前激活的叶路线会得到一个机会来处理动作。 [...]如果没有模板的控制器,也不是当前活动的途径实现的处理程序,该操作将继续泡到任何父路径。 最终,如果ApplicationRoute定义,它将有机会处理的动作。 当一个动作被触发,但没有匹配的动作处理程序控制器,目前的路线,或任何当前路线的祖先上实现,错误将被抛出。



Answer 2:

您可以指定目标属性明确,如@斯特凡指出,为了在其他地方送的动作。

如果没有指定,一个动作助手的目标是controller.target。 正如你提到的,这通常被设置为路由器。

如果你有你想要的默认目标是不同的模板,你可以通过设置控制器的目标属性这种情况发生。 例如,设定目标到控制器本身:

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


Answer 3:

控制器将不负责行为事件的“直接”。 国家/路线。

我相信https://github.com/emberjs/ember.js/issues/1015会帮助你。



文章来源: Ember.js Router Action to Controller