ember.js - Ember Simple Auth - 将当前用户注入(inject)每条路由

标签 ember.js dependency-injection ember-simple-auth

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

我关注了these instructions尝试将当前用户对象添加到 session 中,并且它使用了这个稍微修改过的代码:

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,我得到以下信息:

DEPRECATION: lookup was called on a Registry. The initializer API no longer receives a container, and you should use an instanceInitializer to look up objects from the container. See http://emberjs.com/guides/deprecations#toc_deprecate-access-to-instances-in-initializers for more details.



我知道我需要将以上内容拆分为/app/initializers 和/app/instance-initializers (根据注释 here ),但我不太确定如何去做。

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

谢谢

最佳答案

这对我有用:

  • ember-cli:0.2.7(ember:1.12.0,ember-data:1.0.0-beta.18)
  • ember-cli-simple-auth: 0.8.0-beta.3

  • 注:
  • Ember 数据:1.13。存储在初始化程序中注册,应该按原样工作
  • Ember 数据:1.0.0-beta.19。存储在实例初始化器中注册,需要一些调整

  • 1) 自定义 session
    //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)通过初始化程序将存储注入(inject) session (否则 find() 将不起作用)
    //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
    }
    

    3) 在模板中
    {{#if session.isAuthenticated}}
      {{session.currentUser.name}}
    {{/if}}
    

    注意:这并不能使您摆脱由 ember-simple-auth 产生的弃用。本身。

    关于ember.js - Ember Simple Auth - 将当前用户注入(inject)每条路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30872684/

    相关文章:

    javascript - 为什么缺少模板/组件不会在 Ember.js 中引发错误?

    ember.js - 如何在 Ember-data 中嵌入一对一的关系?

    javascript - Ember-Template-Lint 如何修复 hbs 文件中的 block 缩进错误?

    c# - 如何从 .NET Core 3.1 中的 DI 获取 SignalR IHubContext?

    javascript - 通过依赖注入(inject)将参数传递给命名函数

    ember.js - Ember 简单认证: Session lost on refresh

    ember.js - Ember 数组数据

    c# - 在自己的 ServiceCollection 中获取 IConfiguration

    ember.js - Ember RSVP Promise 解析总是返回未定义的值

    ember-cli - 使用 Ember 简单例份验证 + Ember CLI 的自定义身份验证器