Ember.js 将用户作为计算属性保存到会话
我已经看到了关于这方面的其他问题(比如),我相信这应该是可行的Ember.js 将用户作为计算属性保存到会话,ember.js,ember-simple-auth,Ember.js,Ember Simple Auth,我已经看到了关于这方面的其他问题(比如),我相信这应该是可行的 import Ember from 'ember'; import Session from 'simple-auth/session'; export default { name: 'session-with-me', before: 'simple-auth', initialize: function() { Session.reopen({ me: function() {
import Ember from 'ember';
import Session from 'simple-auth/session';
export default {
name: 'session-with-me',
before: 'simple-auth',
initialize: function() {
Session.reopen({
me: function() {
if (this.get('isAuthenticated')) {
return this.container.lookup('service:store').find('me', { singleton: true });
}
}.property('isAuthenticated')
});
}
};
find('me',{singleton:true})
是ember jsonapi资源的工作补丁。在调试过程中,我可以看到正在发送的请求和有效负载。我在应用程序的其他地方使用了相同的find
调用,可以确认模型得到了良好的实例化
在inspector上,在container>simple auth session
下,我可以将me
视为会话属性,但它显示为{u id:68,\u label:undefined…}
设置会话属性的方法是否已更改?我可能在某个地方看到有人提到这件事,但我再也找不到了
这与的领域相同,但我放弃了这种方法,尝试独立于身份验证过程获取用户。这很可能是ember jsonapi资源的问题,而不是ember Simple Auth的问题
虽然您应该定义自己的会话来扩展Ember Simple Auth提供的默认会话,但不要重新打开会话-例如,请参见下面的答案:我们最终使其工作如下:
// app/sessions/me.js
export default Session.extend({
me: function() {
var accessToken = this.get('secure.access_token');
if (!Ember.isEmpty(accessToken)) {
let self = this;
return this.container.lookup('service:me').find({}).then((me) => {
self.set('me', me);
});
}
}.property('secure.access_token')
});
// app/config/environment.js
ENV['simple-auth'] = {
session: 'session:me'
}
部分原因是资源服务在EJR中初始化的方式(因此@Marcow对这一点的直觉是正确的),另一部分原因是我的编码不好
有趣的是,我们不必在容器中显式注册会话设置这样的自定义会话:
export default Session.extend({
me: function() {
var accessToken = this.get('secure.access_token');
if (!Ember.isEmpty(accessToken)) {
return DS.PromiseObject.create({
promise: this.container.lookup('service:me').find({});
});
}
}.property('secure.access_token')
});
// app/config/environment.js
ENV['simple-auth'] = {
session: 'session:me'
}
DS.PromiseObject
实际上是您未使用的余烬数据的一部分-我不知道您选择的库中是否有等效项。设置一个名为cp的属性(它有效地替代了cp)并不是什么好事。我认为使用您的解决方案,me
属性在用户注销后也会保留其价值。您应该返回承诺或将其包装在承诺对象中,或者使用设置(或取消设置)me
属性的观察者。@marcow我明白了。我当时“不接受”我的答案。问题是,我试着走承诺路线,但我真的还不精通如何使用它们。这两个问题也是关于这一点的,我想问这段代码是什么样子的。参考文献很有帮助,因为它指出了上述解决方案的问题,但这并不是我真正需要的——我正在寻找最终的解决方案。看到ESA 1.0如何实现这一点是特别有趣的,当然也没有,但我在slack上询问了它,看起来内联定义它就像var PromiseObject=Ember.ObjectProxy.extend(Ember.PromiseProxyMixin)一样简单代码>