Ember Simple Auth - 将当前用户注入每条路线

时间:2015-06-16 16:01:08

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

我正在使用Ember Simple Auth构建网站。

我跟着these instructions尝试将当前用户对象添加到会话中并使用这个略微调整的代码工作:

  var map;
    function InitializeMap() {
        alert('works');
        var lat = @Model.LoginCoordinates.First().Latitude;
        var lon = @Model.LoginCoordinates.First().Longitude;
        var latlng = new google.maps.LatLng(lat, lon);
        var mapOptions =
        {
            zoom: 16,
            center: latlng,
            mapTypeId: google.maps.MapTypeId.ROADMAP,
            disableDefaultUI: true
        };
        map = new google.maps.Map(document.getElementById("map"), mapOptions); //this breaks the script

    }
    window.addEventListener('load', InitializeMap);

然而,使用最新版本的Ember我得到以下内容:

  

弃用:在注册管理机构上调用了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'), }); } }; lookup API不再接收容器,您应使用initializer从容器中查找对象。有关详细信息,请参阅http://emberjs.com/guides/deprecations#toc_deprecate-access-to-instances-in-initializers

我知道我需要将上面的内容拆分为/ app / initializers和/ app / instance-initializers(根据说明here),但我不太清楚如何去做。

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

由于

3 个答案:

答案 0 :(得分:8)

这对我有用:

  • 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-data:1.13。商店已在初始化程序中注册,应按原样运行
  • ember-data: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()将无法工作)

//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本身生成的弃用。

答案 1 :(得分:6)

首先,您不应该重新打开会话,而是使用自定义会话(请参阅此示例:https://github.com/simplabs/ember-simple-auth/blob/master/examples/4-authenticated-account.html#L132)。此外,您不应该仅在设置访问令牌时加载当前用户,而是在会话通过身份验证('session.get('isAuthenticated')')时使您的代码不依赖于身份验证器。

有关在初始化程序中使用注册表的弃用警告将在ESA 0.9.0中消失。

答案 2 :(得分:2)

这是我前几天做的初始化程序/实例初始化程序之前和之后的步骤。

之前

export function initialize( instance) {
    var session = Ember.Object.create({
        user:null,
        authorization:null
    });

    instance.registry.register('session:main', session, { instantiate: false });
    instance.registry.injection('route', 'session', 'session:main');
    instance.registry.injection('controller', 'session', 'session:main');
    instance.registry.injection('adapter', 'session', 'session:main');
}

store:application

Ember Data Stuff

应使用export function initialize(instance) { var store = instance.container.lookup('store:application'); .... } export default { name: 'socket', initialize: initialize, after:['ember-data'] };

获取最新迭代中的Ember数据
    .container {
    height: 580px;
    width:700px;
    margin: 0 auto;
    z-index: 1;
    overflow: hidden;
    position: relative;
    border:1px solid black;
}
.container img {
    position: absolute;
    left: -100%;
    right: -100%;
    top: -100%;
    bottom: -100%;
    margin: auto;
    height: 580px;
}