Ember 自定義適配器

2018-01-06 18:01 更新

Ember應(yīng)用中適配器決定了數(shù)據(jù)保存到后臺的方式,比如URL格式和請求頭部。Ember Data默認(rèn)的適配器是內(nèi)置的REST API回調(diào)

實(shí)際使用中經(jīng)常會(huì)擴(kuò)展默認(rèn)的適配器。Ember的立場是應(yīng)該通過擴(kuò)展適配器來添加不同的功能,而非添加標(biāo)識。這樣可以使得代碼更加容易測試、更加容易理解,同時(shí)也降低了可能需要擴(kuò)展的適配器的代碼。

如果你的后端使用的是Ember約定的規(guī)則那么可用使用適配器adapters/application.js。適配器application優(yōu)先級比默認(rèn)的適配器高,但是比指定的模型適配器優(yōu)先級低。模型適配器定義規(guī)則是:adapter-modelName.js。比如下面的代碼定義了一個(gè)模型適配器adapter-post。

//  app/adapters/adapter-post.js


import Ember from 'ember';
export default DS.JSONAPIAdapter.extend({
    namespace: 'api/v1'
});

此時(shí)適配器的優(yōu)先級次序?yàn)椋?code>JSONAPIAdapter > application> 默認(rèn)內(nèi)置適配器;

Ember內(nèi)置的是配有如下幾種:

  1. DS.Adapter 這個(gè)適配器是最基礎(chǔ)的適配器,它不包含任何功能。如果需要?jiǎng)?chuàng)建一個(gè)與Ember適配器有根本性區(qū)別的適配器可以使從這個(gè)適配器入手。
  2. DS.JSONAPIAdapter 這個(gè)適配器是默認(rèn)適配器,并且是遵循JSON API規(guī)范,用于與HTTP服務(wù)器之間通過XHR交互JSON數(shù)據(jù)。
  3. DS.RESTAdapter 這個(gè)適配器與第二個(gè)適配器功能一樣,并且在Ember Data2.0之前是作為默認(rèn)的適配器。

1,自定義JSONAPIAdapter適配器

JSONAPIAdapter適配器通常用于擴(kuò)展非標(biāo)準(zhǔn)的后臺接口。

1,URL規(guī)范

JSONAPIAdapter適配器非常智能,它能夠自動(dòng)確定URL鏈接是那個(gè)模型。比如,如果你需要通過id獲取post

this.store.find('post', 1).then(function(post) {
    //  處理post
});

JSONAPIAdapter會(huì)自動(dòng)發(fā)送get請求到/post/1。

下表是Action、請求、URL三者的映射關(guān)系(由于本站markdown解析器不支持表格所以直接使用截圖替代了)。

映射關(guān)系截圖

比如在action中執(zhí)行find()方法,會(huì)發(fā)送get請求,JSONAPIAdapter會(huì)自動(dòng)解析成形如/posts/1的URL。

2,多元化定制

為了適配復(fù)數(shù)名字的模型屬性名稱,可以是使用Ember Inflector綁定別名。

let inflector = Ember.Inflector.inflector;
inflector.irregular('formula', 'formulae');
inflector.uncountable('advice');

這樣綁定之后目的是告訴JSONAPIAdapter。你可以使用/formulae/1代替/formulas/1。但是目前我還沒搞清楚這個(gè)設(shè)置是什么意思?又有什么用?如果讀者知道請指教。

3,斷點(diǎn)路徑定制

使用屬性namespace可以設(shè)置URL的前綴。

app/adapters/application.js
import Ember from 'ember';
export default DS.JSONAPIAdapter.extend({
  namespace: 'api/1'
});

請求person會(huì)自動(dòng)轉(zhuǎn)發(fā)到/api/1/people/1

4,自定義主機(jī)

默認(rèn)情況下適配器會(huì)轉(zhuǎn)到當(dāng)前域名下。如果你想讓URL轉(zhuǎn)到新的域名可以使用屬性host設(shè)置。

app/adapters/application.js
import Ember from 'ember';
export default DS.JSONAPIAdapter.extend({
  host: 'http://api.example.com'
});

注意:如果你的項(xiàng)目是使用自己的后臺數(shù)據(jù)庫這個(gè)設(shè)置特別重要!??!屬性host所指的就是你服務(wù)器接口的地址。

請求person會(huì)自動(dòng)轉(zhuǎn)發(fā)到http://api.example.com/people/1。

5,自定義路徑

默認(rèn)情況下Ember會(huì)嘗試去根據(jù)復(fù)數(shù)的模型類名、中劃線分隔的模型類名生成URL。如果需要改變這個(gè)默認(rèn)的規(guī)則可以使用屬性pathForType設(shè)置。

// app/adapters/application.js
import Ember from ‘ember’;
export default DS.JSONAPIAdapter.extend({
  pathForType: function(type) {
    return Ember.String.underscore(type);
  }
});

修改默認(rèn)生成路徑規(guī)則為下滑線分隔。比如請求person會(huì)轉(zhuǎn)向/person/1。請求user-profile會(huì)轉(zhuǎn)向/user_profile/1(默認(rèn)情況轉(zhuǎn)向user-profile/1)。

6,自定義請求頭

有些請求需要設(shè)置請求頭信息,比如提供APIkey??梢砸枣I值對的方式設(shè)置頭部信息,Ember Data會(huì)為每個(gè)請求都加上這個(gè)頭信息設(shè)置。

app/adapters/application.js
import Ember from 'ember';
export default DS.JSONAPIAdapter.extend({
  headers: {
'API_KEY': 'secret key',
'ANOTHER_HEADER': 'some header value'
  }
});

更強(qiáng)大地方是你可以在header中使用計(jì)算屬性,動(dòng)態(tài)設(shè)置請求頭信息。下面的代碼是將一個(gè)session對象設(shè)置到適配器中。

app/adapters/application.js
import Ember from ‘ember’;
export default DS.JSONAPIAdapter.extend({
  session: Ember.inject.service(‘session’);
  headers: Ember.computed(‘session.authToken’, function() {
‘API_KEY’: this.get(‘session.authToken’),
‘ANOTHER_HEADER’: ‘some header value’  
  });
});

對于session應(yīng)該非常不陌生,特別是在控制用戶登錄方面使用非常廣泛,另外又一個(gè)非常好用的插件,專門用于控制用戶登錄的,這個(gè)插件是Ember Simple Auth,另外有一篇博文是介紹如何使用這個(gè)插件實(shí)現(xiàn)用戶登錄的,請看使用ember-simple-auth實(shí)現(xiàn)Ember.js應(yīng)用的權(quán)限控制的介紹。

你還可以使用volatile()方法設(shè)置計(jì)算屬性為非緩存屬性,這樣每次發(fā)送請求都會(huì)重新計(jì)算header里的值。

// app/adapters/application.js
import Ember from ‘ember’;
export default DS.JSONAPIAdapter.extend({
  //  ……
  }).volatile();
});

更多有關(guān)于適配器的信息瀏覽下面的網(wǎng)址:

對于適配器主要掌握JSONAPIAdapter足矣,如果你需要個(gè)性化定制URL或者請求的域名可以在適配中配置。不過大部分情況下都是使用默認(rèn)設(shè)置。


博文完整代碼放在Github(博文經(jīng)過多次修改,博文上的代碼與github代碼可能有出入,不過影響不大?。绻阌X得博文對你有點(diǎn)用,請?jiān)趃ithub項(xiàng)目上給我點(diǎn)個(gè)star吧。您的肯定對我來說是最大的動(dòng)力??!

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號