2014-09-03 15 views
9

Geçtiğimiz günlerde Ember'den Ember CLI'ye geçiş yaptık ve bir modeli özel bir bağdaştırıcıyla ilişkilendirmek için uygun kuralları bulamadık.Özel bağdaştırıcıları belirli modellerle ilişkilendirmek için Ember CLI

Tarih Biz bu form verileri ve ikili veri bizim arka uç API [raylar] bir bitiş noktasına itti olabilir böylece onların oluşturma güzergahın parçası olarak bir dosya yükleme var modeller için bir adaptör yarattı. Bağdaştırıcı, isteği istek üzerine eklemek için FormData nesnesini kullanır. Bu bağdaştırıcıyı yalnızca dosyaları olan modellerde kullanmayı tercih ettim ve dosya olmayan yükleme modellerinde uygulama bağdaştırıcısını kullanıyorum. Bu yüzden, ember uygulamasının birden çok bağdaştırıcıyı desteklemesini istiyorum.

Özel Adaptörü: adaptörleri içinde /dosya-upload.js

"klasik" Kor, bu kongre aracılığıyla bir model üzerinde belirli bir adaptör kullanmak kor söylemek mümkün oldu ise
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(); 

Ama şimdi bu genel nesnelerimiz Ember CLI'de yok, bir bağdaştırıcı belirtmenin bir yolu var mı? Modelimi dışa aktarmadan önce bir değişkene atamak istediğimi ve ek ayarların burada yapıldığını varsayalım.

Ember cli paradigmasına uymayı arzuluyorum, bu yüzden eğer bunun çok uzak olduğunu düşünüyorsanız lütfen bana bildirin. Bir bağdaştırıcı kullanıp dosya algılamayı yeniden yapılandırabilirdim, ancak özel işlevsellikleri birden çok bağdaştırıcıya ayırarak temizler.

Teşekkürler!

cevap

20

Ember Data, bağdaştırıcıları aramak için çözümleyiciyi kullanır. Tür başına bir adaptör adapter:<type> üzerinden bakıldığında, Person için, bu adapter:person. Bu modülleri dosya adlarına göre aramak için es6 modüllerini ve jj-abrams-resolver'u kullanır. Genellikle şu şekilde görünür: <type>:blah<type>s/blah'u arar, böylece adapter:person için adapters/person'u arar.

bunu yapabilirsiniz (adapters/file-upload içinde bulunur) FileUploadAdapter uzanan bir PersonAdapter kadar Tel için:

// where `App` is the Global name for your app. 
var applicationAdapter = App.__container__.lookup('adapter:application'); 
var personAdapter = App.__container__.lookup('adapter:person'); 
: Uygulamanızın konsoldaki çözümleyicinizi kontrol edebilirsiniz

// adapters/person.js 

import FileUploadAdapter from './file-upload'; 

export default FileUploadAdapter.extend(); 

+1

Fantastik ve eksiksiz bir yanıt. Bu, ember cli ve es6 mondüllerinin yapısı üzerinde güzel bir spot ışığı. –

İlgili konular