2

这是我的设置:

余烬:1.1.0-beta.1

灰烬数据:1.0.0-beta.2

# ON STARTUP
APP.ApplicationAdapter = DS.RESTAdapter.extend(
  headers: {
    'X-API-TOKEN': localStorage.token
  }
)

如果他们在刷新时已经登录,这很好用......

然而...

#ON LOGIN FORM SUBMIT ACTION
$.post('/sessions', data).then( (response) =>
  if response.token
    localStorage.token = response.token
    APP.ApplicationAdapter = DS.RESTAdapter.reopen(
      headers: {
        'X-API-TOKEN': localStorage.token
      }
    )
  else
    @set('error_message', response.error)

这些调用仍然是未经授权的,并且适配器继续尝试传递旧令牌。

所以基本上适配器上的 'headers' 属性不会被 'reopen' 方法更新。在 ember-data 中更改适配器的正确方法是什么?

多谢你们

4

2 回答 2

2

标头可用作计算属性以支持动态标头。您可以使用 volatile 函数将属性设置为非缓存模式,从而使每个请求都重新计算标头。

APP.ApplicationAdapter = DS.RESTAdapter.extend(
  headers: function() {
    return {
      'X-API-TOKEN': localStorage.token 
    };
  }.property().volatile()
)

网址:

toc_headers-自定义

方法易失性

于 2014-10-28T06:16:31.310 回答
2

实例化后,您应该从容器中获取适配器。

但是由于您从哪里提出请求并不是很清楚,请尝试以下操作:

#ON LOGIN FORM SUBMIT ACTION
$.post('/sessions', data).then( (response) =>
  if response.token
    localStorage.token = response.token

    adapter = APP.__container__.lookup 'adapter:Rest'
    adapter.set('headers', { 'X-API-TOKEN': localStorage.token })

  else
    @set('error_message', response.error)

注意:App.__container__根据您提出请求的位置,不建议将 using 用于生产代码,以更干净的方式获取容器会更合适。

更新以响应您的最后评论

如果您需要访问控制器中的容器,则:

APP.LoginController = Ember.ObjectController.extend
  ...
  adapter = @get('container').lookup 'adapter:application'
  adapter.set('headers', { 'X-API-TOKEN': localStorage.token })
  ...

应该给你适配器。

希望能帮助到你。

于 2013-09-23T09:40:58.190 回答