Ember.js在加载时设置应用程序属性

时间:2013-07-26 18:48:47

标签: ember.js

我正在尝试通过我的REST API获取当前登录用户,然后将其设置为ApplicationController的属性。这就是我试图这样做的方式:

App.ApplicationController = Ember.Controller.extend({
    init: function() {
        this._super();
        var self = this;
        App.User.findCurrent().then(function(user) {
          self.set('currentUser', user);
        });
    }
});

App.User = Ember.Object.extend({});

App.User.reopenClass({
    findCurrent: function() {
        return $.getJSON('/api/v1/users/current').then(
            function(response) {
                return response.user;
            }
        );
    }
});

当我查看Chrome网络标签时,我看到有一个API调用并且返回了JSON,但是当我尝试访问例如我的应用程序模板(或其中的一部分)中的{{currentUser.name}},它不会返回名称。也没有错误。

但是在应用程序模板中它不会返回它。

我错过了什么?

谢谢!

修改

当我创建另一个控制器时,例如HelpController并访问/help,然后{{currentUser.name}}会返回用户名:

App.HelpController = Ember.Controller.extend({
    needs: ['application'],
    currentUser: Ember.computed.alias('controllers.application.currentUser')
});

修改2

抱歉,我忘了提到我实际上是尝试使用部分({{currentUser.name}})中的{{partial 'sidebar'}},但这不应该改变任何东西,因为这是相同的范围,对吧? / p>

编辑3

我注意到一些非常奇怪的事情。当我在我的应用程序模板中调用{{currentUser.name}}时(这不是我想要的btw),那么它也适用于{{partial 'sidebar'}}

编辑4

根据要求:

DEBUG: Ember.VERSION : 1.0.0-rc.6 ember.js?body=1:361
DEBUG: Handlebars.VERSION : 1.0.0-rc.4 ember.js?body=1:361
DEBUG: jQuery.VERSION : 1.10.0

1 个答案:

答案 0 :(得分:1)

这不是放置这个逻辑的正确位置。您可以使用model上的路由挂钩afterModelApplicationRoute来轻松完成此操作。通常在ember中,数据的加载是在路由钩子中完成的。这允许路由器在加载时暂停,因此当控制器和模板发挥作用时,它们正在处理加载的数据。

App.ApplicationRoute = function() {
  model: function() {
    return App.User.findCurrent();
  },
  afterModel: function(model) {
    App.set('currentUser', model)
  }
}