0

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

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

在 myApplicationRoute中,我获取 id,获取相应的用户模型,然后将模型设置为currentUsermy 上的属性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。

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

4

1 回答 1

0

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

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

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

注意ApplicationRoutefrom的变化

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);

因为控制器传入

于 2014-08-07T22:56:56.827 回答