Emberjs从另一个对象调用一个方法

时间:2014-03-03 16:17:59

标签: ember.js

这可能是一个愚蠢的问题,但我无法在任何地方找到任何相关信息......

我在我的一个控制器中创建了一个方法,以验证用户会话是否仍然良好,并且我在我的beforeModel中的应用程序的几乎每个页面中都使用此方法。但问题是我不想每次都在每条路线上复制/粘贴代码,这会很脏,我真的不喜欢它。

假设我有这个控制器:

App.LoginController = Ember.ObjectController.extend({
   ...
    isSession: function() {
        var session = this;
        Ember.$
        .get(host + '/session', function(data) {
            console.log('DEBUG: Session OK');
        })
        .fail(function() {
            console.log('DEBUG: Session FAIL');
            session.transitionToRoute('login');
        });
    }
});

如何在此路由器中调用它:

App.HomeRoute = Ember.Route.extend({
    beforeModel: function(transition) {
      //Here
    },
    model: function() {
        return this.store.all('login');
    }
});

我已尝试过此this.get('loginController').isSession();,但收到此错误Error while loading route: TypeError: Cannot call method 'isSession' of undefined

感谢您的帮助!

[编辑]

我没有太多要展示但是:

我的地图

App.Router.map(function() {
    this.route('login', { path: '/' });
    this.route('home');
    this.resource('enquiries', function() {
       this.route('enquiry', { path: '/:enquiry_id' }, function() {
           this.route('update');
       });
    });
});

我很可能只有一个LoginController和我的HomeRoute。 (它的应用程序的开头) 我不需要为我的登录创建路由,因为我的登录模板中有一个动作助手,之后我被重定向到我的主页模板。

2 个答案:

答案 0 :(得分:2)

您需要使用controllerFor()方法才能从路由器调用控制器上的方法。如果方法是一项操作,则需要使用send()方法,例如this.controllerFor('login').send('isSession')

App.HomeRoute = Ember.Route.extend({
  actions: {
    willTransition: function(transition) {
      transition.abort();
      this.controllerFor('login').isSession()
  }
});

答案 1 :(得分:1)

如果您不需要isSession的返回值,则可以考虑在顶级路线上将其设为actionThe router.send method in the docs有一个非常好的例子,说明你如何宣布行动以及你如何称呼它们。请注意,send也是您可以在控制器上调用的方法。操作从控制器冒泡到父路由,然后一直向上路由层次结构,如here所示