如何加载当前用户的emberjs

时间:2014-08-07 20:58:42

标签: jquery ember.js ember-data ember.select

我想在帐户页面上访问当前用户的信息,以便进行编辑。我不知道如何获取当前用户,所以我在我的服务器上设置了一个名为session的路由。

在我的服务器上访问'/ session'会返回一个JSON blob { session: {id: "<guid>"}},它是会话中当前用户的ID。

在我的ApplicationRoute中,我获取了ID,获取了相应的用户模型,然后将模型设置为currentUser上的ApplicationController属性。

App.ApplicationRoute = Ember.Route.extend({
    setupController: function (controller) {
        var self = this;
        $.getJSON('/session', function (data) {
            if (data && data.session && data.session.id) {
                self.set('controller.currentUser', self.store.find('user', data.session.id));
            }
        });
    }
});

我可以在设置currentUser之后从索引模板中访问属于IndexController的字符串属性,如下所示:

App.IndexController = Ember.Controller.extend({
    needs: ['application'],
    currentUser: function () {
        return this.get('controllers.application.currentUser');
    }.property('controllers.application.currentUser')
});

这很好,但是当我尝试设置多个值Ember.Select时,我收到此错误:

Assertion Failed: Cannot delegate set('roles', []) to the 'content' property of object proxy <DS.PromiseObject:ember435>: its 'content' is undefined.

我做了jsbin

它展示了我正在尝试做的事情。我非常有信心我的错误与ajax请求getJSON有关,因为我的jsbin示例适用于localstorage。

我应该如何加载当前用户?谢谢!

1 个答案:

答案 0 :(得分:0)

问题是因为self.store.find('user', data.session.id)返回的是承诺而不是记录

如果更改代码以便将currentUser设置为promise所解析的记录(如下所示),那么它可以正常工作。

App.ApplicationRoute = Ember.Route.extend({
    setupController: function (controller) {
        var self = this;
        $.getJSON('/session', function (data) {
            if (data && data.session && data.session.id) {
                self.store.find('user', data.session.id).then(function(user){
                    // set this in the "then"
                    self.set('controller.currentUser', user);

                    // you should also be able to change the above line to
                    // controller.set('currentUser', user);
                    // because the "controller" is passed in
                });
            }
        });
    }
});

非工作箱:http://emberjs.jsbin.com/xufec/1/edit?js,console,output
工作箱:http://emberjs.jsbin.com/xufec/2/edit?js,console,output

注意ApplicationRoute来自

的变化
self.set('controller.currentUser', self.store.find('user', 1));

self.store.find('user', 1).then(function(user){
  self.set('controller.currentUser', user);
});

作为旁注,您应该能够使用

设置当前用户
controller.set('currentUser', user);

因为传入控制器