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)一样简单