【问题标题】:ember simple auth session.addObserver example?ember 简单的身份验证 session.addObserver 示例?
【发布时间】:2016-01-05 00:35:44
【问题描述】:

如果能看到一个如何将观察者添加到 ember simple auth 的会话服务数据属性的示例,那就太棒了。

我目前遇到另一个问题,但很快就会回来。

目前我在我的 application/route.js 中写了这个,但是我在另一个问题上被阻止了,所以我不知道它有多正确。我什至不知道应用程序路由是否是放置这个观察者的最佳位置,更不用说放在 beforeModel 挂钩中了。

export default Ember.Route.extend({ //adds in login/logout actions
  session: Ember.inject.service('session'),
  //I also tried putting this code in a model() hook, still no luck.
  beforeModel() {
    this.get('session').addObserver('data', (sender, key, value, rev) => {
      console.log('session data addObserver fired with these arguments:', sender, key, value, rev)
    })
  },
  actions: {
    error: function(error, transition) {
      console.error('ApplicationRoute error action', arguments)
      // substate implementation when returning `true`
      return true;
    }
  }
}).extend(ApplicationRouteMixin)

注意:我正在使用 service.addObserver api 的未记录版本,可能会有点问题,但我提交了一个关于此的拉取请求:https://github.com/emberjs/ember.js/pull/12768

【问题讨论】:

  • 这个的用例是什么?您希望在会话数据中的任何内容发生变化时触发观察者?
  • 是的,跟踪会话数据的所有更改。

标签: ember.js ember-simple-auth


【解决方案1】:

此代码存在 99%。我缺少的是我应该为我想要跟踪的每个data.key 添加观察者,而不仅仅是data。这是我申请路线中的最终代码:

var sentData = {}
var sendToExtension = (service, key, value, rev/*ignored*/) => {
  if (value != null) console.log('value actually is defined for once!', value, 'rev:', rev)
  // It seems value is always undefined. Here we check if it's undefined or null and if 
  if (value == null && service.get(key) != null) value = service.get(key) 
  if (sentData[key] != null && sentData[key] === value) {
    console.log('already sent '+key+': '+value+', returning')
    return
  }
  sentData[key] = value
  //proceed however you want with the knowledge that the `key` has just been set to this `value
}

var haveRegisteredSessionObservers = false
export default Ember.Route.extend({ //adds in login/logout actions
  session: Ember.inject.service('session'),
  beforeModel() {
    //if we're in chrome, add session data observer to send the session data back to the extension background page
    if (window.chrome && !haveRegisteredSessionObservers) {
      applicationRouteInstance = this
      ;['data.email', 'data.user_id', 'isAuthenticated'].forEach((key) => {
        this.get('session').addObserver(key, sendToExtension)
      })
      haveRegisteredSessionObservers = true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    相关资源
    最近更新 更多