Ember.js Ember Simple Auth-将当前用户注入每个路由

Ember.js Ember Simple Auth-将当前用户注入每个路由,ember.js,dependency-injection,ember-simple-auth,Ember.js,Dependency Injection,Ember Simple Auth,我正在使用Ember Simple Auth构建一个站点 我随后尝试将当前用户对象添加到会话中,它成功了,使用了以下稍加修改的代码: import Ember from 'ember'; import Session from 'simple-auth/session'; export default { name: "current-user", before: "simple-auth", initialize: function(container) { Sessio

我正在使用Ember Simple Auth构建一个站点

我随后尝试将当前用户对象添加到会话中,它成功了,使用了以下稍加修改的代码:

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

export default {
  name: "current-user",
  before: "simple-auth",
  initialize: function(container) {
    Session.reopen({
      setCurrentUser: function() {
        var accessToken = this.get('secure.token');
        var _this = this;
        if (!Ember.isEmpty(accessToken)) {
          return container.lookup('store:main').find('user', 'me').then(function(user) {
            _this.set('content.currentUser', user);
          });
        }
      }.observes('secure.token'),
      setAccount: function() {
        var _this = this;
        return container.lookup('store:main').find('account', this.get('content.currentUser.account.content.id')).then(function(account) {
          _this.set('content.account', account);
        });
      }.observes('content.currentUser'),
    });
  }
};
然而,使用最新版本的Ember,我得到以下信息:

弃用:
lookup
已在注册表上调用。
initializer
API不再接收容器,您应该使用
instanceInitializer
从容器中查找对象。有关更多详细信息,请参阅

我知道我需要将上述内容拆分为/app/初始值设定项和/app/实例初始值设定项(根据注释),但我不太确定如何进行

当然,如果有一种更简单/更干净的方法使每个路由/模板都可以使用用户和帐户对象,我很乐意听到:)


谢谢

这是我前几天做的初始化器/实例初始化器的前后对比

之前 之后 余烬数据资料 应使用
store:application

export function initialize(instance) {
    var store = instance.container.lookup('store:application');
    ....
}

export default {
    name: 'socket',
    initialize: initialize,
    after:['ember-data']
};

首先,不应重新打开会话,而应使用自定义会话(请参见此示例:)。此外,您不应仅在设置访问令牌时加载当前用户,还应在对会话进行身份验证时加载当前用户(
'session.get('isAuthenticated')”
),这使您的代码不依赖于身份验证程序

有关在初始值设定项中使用注册表的弃用警告有望在ESA 0.9.0中消失。

这对我来说适用于:

  • 余烬cli:0.2.7(余烬:1.12.0,余烬数据:1.0.0-beta.18)
  • ember cli简单身份验证:0.8.0-beta.3
注意:

  • 余烬数据:1.13。存储已在初始值设定项中注册,应按原样工作
  • 余烬数据:1.0.0-beta.19。存储已在实例初始值设定项中注册,需要进行一些调整
1) 自定义会话

//config/environment.js
ENV['simple-auth'] = {
  session: 'session:custom',
  ...
}

//app/sessions/custom.js
import Session from 'simple-auth/session';

export default Session.extend({

  // here _store is ember-data store injected by initializer
  // why "_store"? because "store" is already used by simple-auth as localStorage
  // why initializer? I tried 
  // _store: Ember.inject.service('store') and got error

  currentUser: function() {
    var userId = this.get('secure.userId');
    if (userId && this.get('isAuthenticated')) {
      return this._store.find('user', userId);
    }
  }.property('secure.userId', 'isAuthenticated')

});
2) 通过初始值设定项将存储注入会话(否则find()将不起作用)

3) 模板中

{{#if session.isAuthenticated}}
  {{session.currentUser.name}}
{{/if}}

注意:这不会使您免于
ember simple auth
本身产生的反对意见

谢谢你的建议,Marcow,以及你在ember simple authHi@Marcow上的所有工作。你能更新链接吗?或者提供一个新的例子?自1.0以来,定制会话的整个概念不再存在。相反,你可以只使用一项服务——查看repo中的虚拟应用程序:对于其他查看@Marcow链接的人,你可能也希望看到这项服务的使用:一个非常好的答案,非常感谢。我必须更新我的定制Desive::SessionController以返回用户ID以及令牌和电子邮件,但除此之外,它工作得完美无缺。Artych,这只是一个快速的后续问题-我可以使用
this.get('session.currentUser')
访问控制器中的会话对象,但这在路由中似乎不起作用。我应该做些不同的事情吗?谢谢不要忘记,
currentUser
是一个承诺。
this.get('session.currentUser')。然后(函数(用户){console.log('user-name',user.get('name'))})适用于每条路线。(感谢您之前的评论)您还可以通过添加:
var\u store=this.container.lookup('store:application'),省去初始值设定项到custom.js。如果您的_store-variable未定义(错误:“find on undefined”)。请在
Ember:2.2.0
Ember-Data:2.2.1
Ember-Simple-Auth:1.0.0
上尝试此操作,但无效。
//config/environment.js
ENV['simple-auth'] = {
  session: 'session:custom',
  ...
}

//app/sessions/custom.js
import Session from 'simple-auth/session';

export default Session.extend({

  // here _store is ember-data store injected by initializer
  // why "_store"? because "store" is already used by simple-auth as localStorage
  // why initializer? I tried 
  // _store: Ember.inject.service('store') and got error

  currentUser: function() {
    var userId = this.get('secure.userId');
    if (userId && this.get('isAuthenticated')) {
      return this._store.find('user', userId);
    }
  }.property('secure.userId', 'isAuthenticated')

});
//app/initializers/session-store
export function initialize(container, application) {
  application.inject('session:custom', '_store', 'store:main')

  // "store:main" is highly dynamic depepeding on ember-data version
  // in 1.0.0-beta.19 (June 5, 2015) => "store:application"
  // in 1.13 (June 16, 2015) => "service:store"
}

export default {
  name: 'session-store',
  after: 'ember-data',
  initialize: initialize
}
{{#if session.isAuthenticated}}
  {{session.currentUser.name}}
{{/if}}