2015-04-07 57 views
1
陣列

比方說,我有一個Ember.Data查詢我想提出:格式化查詢參數在Ember.Data

this.store.find('items', {itemIds: [1,2,3]}); 

默認情況下,Ember.Data創建一個類似如下的URL :

items?itemIds%5B%5D=1&itemIds%5B%5D=2&itemIds%5B%5D=3 

但我連接到REST API希望它的格式如下:

items?itemIds=1&itemIds=2&itemIds=3 

如何做到這一點adaptatio N +

回答

2

擴展RESTAdapter並覆蓋ajax方法,並根據具體情況創建要使用的URL。

App.ItemsAdapter = DS.RESTAdapter.extend({ 
    ajax: function(url, type, options){ 
    if(myCircumstance){ 
     var data = options.data; 
     delete options.data; 
     url = url + ......; 
    } 
    return this._super(url, type, options); 
    } 
}); 

REST適配器實現:https://github.com/emberjs/data/blob/v1.0.0-beta.16.1/packages/ember-data/lib/adapters/rest-adapter.js

+0

確定嗎?在https://github.com/emberjs/data/blob/v1.0.0-beta.16.1/packages/ember-data/lib/adapters/build-url-mixin.js#L60 id陣列被排除在外,評論說這是因爲它們作爲查詢參數傳遞。這(和代碼)表明查詢參數在這裏沒有真正處理。 – jnfingerle

+0

你說得對,它必須跳到ajax級別。 – Kingpin2k

0

從我看到期待的餘燼數據的代碼,你必須覆蓋RestAdapterfindQueryajax方法,請參閱http://emberjs.com/api/data/classes/DS.RESTAdapter.html#method_findMany(見https://github.com/emberjs/data/blob/v1.0.0-beta.16.1/packages/ember-data/lib/adapters/rest-adapter.js)。兩者都是私有的,但商店希望findQuery在那裏(https://github.com/emberjs/data/blob/v1.0.0-beta.16.1/packages/ember-data/lib/system/store/finders.js#L137),所以我不希望這種行爲很快發生變化。

如果你使用它來進行生產,你最好打開一個bug報告,將這個或者類似的東西暴露爲公共鉤子,因爲到目前爲止我看不到一個。

0

@ Kingpin2k的回答是正確的方向,但解決方案更簡單。要創建查詢參數,Ember Data只需yields包裝在選項對象中的數據對象到jQuery.ajax函數。

知道了,我們只需要另一個查詢參數序列化器。默認情況下,jQuery將按照TS描述的方式序列化數組。您可以通過覆蓋$.param方法來更改序列化的方式。但幸運的是,我們甚至沒有,因爲$.param函數有第二個參數,稱爲traditional序列化。如果設置爲true,則序列化將像TS想要*那樣。

jQuery.Ajax功能還有traditional標誌使用param序列化的傳統風格。結合這個事實,你只需要自己設置這個標誌:

DS.RESTAdapter.extend({ 
    ajax(url, type, options) { 
    if (options) { 
     options.traditional = true; 
    } 
    return this._super(...arguments); 
    } 
}); 

P.S.如果你使用JSONAPIAdapter,技巧是一樣的,因爲JSONAPIAdapter擴展了RESTAdapter。

*如果您需要另一個序列化,則需要覆蓋$ .param。