Ember cli 错误 ember-simple-auth

Ember cli error with 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。仍然是同样的错误:

我会在会话上定义一个 currentUser 方法,returns 用户作为承诺:

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

此外,您最好定义自己的客户会话 class,它从 Ember 简单验证 Session class 扩展,而不是重新打开它。

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

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