2014-09-03 60 views
9

我們最近從Ember切換到了Ember CLI,並且我無法找到將模型與自定義適配器關聯的適當約定。在Ember CLI中將自定義適配器與特定模型關聯起來

歷史 我們創造了有一個文件上傳作爲其創建路線的一部分,這樣的表單數據和二進制數據可能會在我們的後端API [軌]推到一個端點型號的適配器。適配器使用FormData對象將文件添加到請求。我選擇僅將此適配器用於包含文件的模型,並且使非應用程序適配器具有非文件上載模型。所以我想要這個應用程序支持多個適配器。

自定義適配器:在適配器 /文件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; 

在「經典」灰燼,我能夠告訴燼通過這個約定使用特定的適配器上的模型:

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

但現在我們在Ember CLI中沒有這些全局對象,有沒有辦法指定一個適配器?我假設我將在導出模型之前將模型分配給一個變量,並在那裏執行其他設置。

我希望適應燼類的範例,所以請讓我知道如果你覺得這太離譜了吧。我可以重新使用一個適配器並在其中進行文件檢測,但將自定義功能分離爲多個適配器會感覺更清晰。

謝謝!

回答

20

Ember Data使用解析器查找適配器。每個類型的適配器通過adapter:<type>查找,因此對於個人,這是adapter:person

ember-cli使用es6模塊和jj-abrams-resolver根據文件名查找這些模塊。通常查找是這樣的:<type>:blah會尋找<type>s/blah,所以對於adapter:person它會尋找adapters/person

要連接一個PersonAdapter擴展您的FileUploadAdapter(位於adapters/file-upload),你可以這樣做:

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

// adapters/person.js 

import FileUploadAdapter from './file-upload'; 

export default FileUploadAdapter.extend(); 

您可以在應用程序的控制檯檢查解析器

+1

神奇而徹底的答案。這是一個很好的點燃燼和es6 mondules的結構。 – 2014-09-04 05:03:45

相關問題