我正在使用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),但我不太清楚如何去做。
当然,如果有一种更简单/更清晰的方式让用户和帐户对象可用于每个路径/模板,我很乐意听到它们:)
由于
答案 0 :(得分:8)
这对我有用:
注意:强>
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
应使用export function initialize(instance) {
var store = instance.container.lookup('store:application');
....
}
export default {
name: 'socket',
initialize: initialize,
after:['ember-data']
};
.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;
}