将自定义适配器与Ember CLI中的特定模型相关联

时间:2014-09-03 23:03:17

标签: ember.js ember-cli

我们最近从Ember切换到Ember CLI,但我无法找到将模型与自定义适配器关联的正确约定。

记录 我们为模型创建了一个适配器,它将文件上传作为其Create路径的一部分,以便可以将表单数据和二进制数据推送到后端api [rails]中的一个端点。适配器使用FormData对象将文件添加到请求。我选择仅将此适配器用于包含文件的模型,并且非文件上载模型使用应用程序适配器。所以我希望ember应用程序支持多个适配器。

自定义适配器: 在adapters / file-upload.js中

import DS from 'ember-data';

var FileUploadAdapter = DS.ActiveModelAdapter.extend({
    ajaxOptions: function(url, type, hash) {
        var self = this;
        hash = hash || {};
        hash.url = url;
        hash.type = type;
        hash.dataType = 'json';
        hash.context = this;

        //add post data to formdata object
        if (hash.data && type != 'GET' && type !='DELETE') {
          hash.processData = false;
          hash.contentType = false;
          var fd = new FormData();
          var root = Object.keys(hash.data)[0];

          for (var i = 0; i < Object.keys(hash.data[root]).length; i++) {
            var key = Object.keys(hash.data[root])[i];
            if (hash.data[root][key]) {
              fd.append(root + "[" + key + "]", hash.data[root][key]);
            }
          }
          hash.data = fd;
        }

        var headers = this.get('headers');
        if (headers) {
          hash.beforeSend = function(xhr){
            for (var i = 0; i < Ember.keys(headers).length; i++) {
              xhr.setRequestHeader(Ember.keys(headers)[i], headers[Ember.keys(headers)[i]]);
            }
          }
        }

        return hash;
    }
});

export default FileUploadAdapter;

在“经典”Ember中,我能够告诉ember通过这个约定在模型上使用特定的适配器:

//given a model name "Person", specific adapter via {ModelName}Adapter
App.PersonAdapter = App.FileUploadAdapter.extend();

但是现在我们在Ember CLI中没有这些全局对象,有没有办法指定适配器?我假设我想在导出变量之前将模型分配给变量并在那里进行其他设置。

我希望能够融入恩赐范式,所以如果你认为这种情况离它太远,请告诉我。我可以回到使用一个适配器并在其中进行文件检测,但将自定义功能分成多个适配器感觉更干净。

谢谢!

1 个答案:

答案 0 :(得分:21)

Ember Data使用解析器查找适配器。通过adapter:<type>查找每种类型的适配器,因此对于 Person ,这是adapter:person

ember-cli使用es6模块和jj-abrams-resolver根据文件名查找这些模块。通常查找是这样的:<type>:blah会查找<type>s/blah,因此对于adapter:person,它会查找adapters/person

要连接扩展 FileUploadAdapter PersonAdapter (位于adapters/file-upload),您可以这样做:

// adapters/person.js

import FileUploadAdapter from './file-upload';

export default FileUploadAdapter.extend();

您可以在应用的控制台中查看解析器:

// where `App` is the Global name for your app.
var applicationAdapter = App.__container__.lookup('adapter:application');
var personAdapter = App.__container__.lookup('adapter:person');