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

Wil*_*wby 10 ember.js ember-cli

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

历史 我们为模型创建了一个适配器,这些模型将文件上传作为其创建路径的一部分,以便可以将表单数据和二进制数据推送到后端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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

谢谢!

tst*_*rat 21

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

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

连接扩展FileUploadAdapter(位于adapters/file-upload)的PersonAdapter,您可以执行以下操作:

// adapters/person.js

import FileUploadAdapter from './file-upload';

export default FileUploadAdapter.extend();
Run Code Online (Sandbox Code Playgroud)

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

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