使用ember-simple-auth时出现Ember cli错误

时间:2015-01-14 16:03:21

标签: javascript ember.js ember-cli ember-simple-auth

我尝试将ember-simple-auth与自定义会话一起使用。登录后,当我尝试在模板中访问会话时,如下所示:

{{session.current_user.email}}

我收到以下错误:

Uncaught Error: Assertion Failed: Required contextualElement for view <Ember._HandlebarsBoundView:ember375> is missing

如果我重新加载页面,则错误消失。此外,如果我使用未绑定的帮助程序,它就会消失:

{{unbound session.current_user.email}}

我有以下代码在user_id更改时设置current_user:

import Session from 'simple-auth/session';
import Ember from 'ember';

export function initialize(container) {
  Session.reopen({
    setCurrentUser: function() {
      var id = this.get('user_id');
      var _this = this;
      if(!Ember.isEmpty(id)) {
        return container.lookup('store:main').find('user', id).then(function(user){
          _this.set('current_user', user);
        });
      }
    }.observes('user_id')
  });
}

export default {
  name: 'authentication',
  before: 'simple-auth',
  initialize: initialize
};

我做错了什么?

编辑#1:

我会把这段代码放在哪里?初始化器? app/sessions/custom.js

export default Session.extend({
  currentUser: function() {
    var userId = this.get('user_id');
    if (!Ember.isEmpty(userId)) {
     return this.container.lookup('store:main').find('user', userId);
    }
  }.property('user_id')
});

然后在environment.js中设置:

ENV['simple-auth'] = {
  session: 'session:custom'
}

在初始化程序中我注册了自定义会话?

container.register('session:custom', Session);

编辑#2:

将自定义会话移至sessions/custom.js。还是一样的错误:

Cryptic Ember Error

2 个答案:

答案 0 :(得分:1)

我会在Session上定义一个currentUser方法,将用户作为一个承诺返回:

export default Session.extend({
  currentUser: function() {
    var userId = this.get('user_id');
    if (!Ember.isEmpty(userId)) {
     return this.container.lookup('store:main').find('user', userId);
    }
  }.property('user_id')
});

另外,您应该更好地定义自己的客户会话类,该类从Ember Simple Auth Session类扩展而不是重新打开。

答案 1 :(得分:0)

与marcoow所说的类似,但我们使用的是承诺对象:

app/initializers/simple-auth-session.js

import Session from 'simple-auth/session';
import DS from 'ember-data';

export default {
  name: 'simple-auth-custom-session',
  before: 'simple-auth',
  initialize: function(container) {
    Session.reopen({
      currentUser: function() {
        return DS.PromiseObject.create({
          promise: container.lookup('store:main').find('user', 'me')
        });
      }.property()
    });
  }
};