6

当我使用 Ember 路由器时,如何在模板中定义连接到控制器的操作?

一个例子在这里:http: //jsfiddle.net/KvJ38/3/

在 My Profile 下有两个动作:一个是在 State 上定义的,并且正在工作 两个是在 Controller 上定义的。我怎样才能使这个工作或我应该使用另一种方法?

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");
    },
  }) 
});
4

3 回答 3

13

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

{{action two target="controller"}}

并在“App.ProfileController”中添加“二”功能。

更新

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

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

于 2012-06-15T13:10:57.253 回答
4

如@Stéphane 所述,您可以显式指定目标属性,以便将操作发送到其他地方。

如果未指定,动作助手的目标是 controller.target。如您所述,这通常设置为路由器。

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

App.MyController = Ember.Controller.extend({
  init: function(){
    this._super();
    this.set('target', this);
  };
});
于 2012-07-22T22:28:46.830 回答
0

控制器不应“直接”负责动作事件。状态/路线是。

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

于 2012-06-19T08:54:17.317 回答