在ActiveModelAdapter之外使用适配器头

时间:2014-12-17 02:51:59

标签: javascript jquery ajax ember.js jquery.fileapi

我的授权系统与 Ember Data 完美配合。使用adapater.ajax()代替$.ajax,我的所有余烬数据调用都使用正确的令牌进行签名。但是,我有一个案例,我正在使用第三方上传库,它使用自己的XHR请求(jquery.fileapi)。这个库为它发出的请求公开了一个“headers”属性,但是我不知道最好的方法是从我的适配器中取出标题并将它传递给我正在构建的文件上传组件。

ApplicationAdapter

export default DS.ActiveModelAdapter.extend({

  namespace: 'api/v1',

  headers: function() {
    var authToken = this.get('session.authToken') || 'None';
    return {
      'Authorization': Ember.String.fmt('Bearer %@', authToken)
    };
  }.property('session.authToken')

});

ImageUploadComponent

didInsertElement: function() {
  this.$('.js-uploader').fileapi({
    url: '/api/v1/users/avatar',
    accept: 'image/*',
    headers: {'?????????????'}      
  });
}

当'session.authToken'发生变化时,我宁愿不在“标题”中定义全局。

1 个答案:

答案 0 :(得分:0)

这就是我现在正在做的事情。会喜欢其他解决方案。

DS.Store.reopen({

  apiPathFor: function() {
    var url = arguments.length ? Array.prototype.slice.call(arguments).join('/') : ''
      , adapter = this.adapterFor('application');  
    return [adapter.urlPrefix(), url].join('/');
  }

});

export default Ember.Component.extend({

  endpoint: null,
  store: Ember.computed.readOnly('targetObject.store'),

  didInsertElement: function() {

    var store = this.get('store')
      , adapter = store.adapterFor('application')
      , headers = adapter.get('headers')
      , url = store.apiPathFor(this.get('endpoint'));

    var args = {
      url: url,
      headers: headers,
      accept: 'image/*'
    };

    this.$('.js-fileapi').fileapi(args);
  },

 });