ID で REST リソースを取得するには、次の 2 つの方法があります。
GET /users/1
GET /users/1,2
1 つ目は のような単一のオブジェクト{id:1,name:"John"}
を返し、2 つ目は のような配列を返します[{id:1,name:"John"},{id:2,name:"Jill"}]
。
これが正当な REST であるかどうかについての議論はご遠慮ください。サービスにこれがあることを受け入れるだけで、私はそれを扱う必要があります。
angular の $resource は、実際にはリクエスト側からインテリジェントに処理します。
User.get({users:['1','2']})
に変換します
GET /users/1,2
しかし、それは応答をうまく処理しません。単一のオブジェクトが必要です。定義を に変更するとisArray:true
、単一のリクエストで失敗しますGET /users/1
両方をインテリジェントに処理するにはどうすればよいですか?
編集:私はそれを機能させるためにいくつかの奇妙なハッキングを行いましたが、ネイティブメソッドを好むでしょう:
factory('Resource',['$resource','_',function ($resource,_) {
return function(url,params,methods){
var defaults = {
getSingle: {method: 'get', isArray:false},
getMultiple: {method: 'get', isArray:true}
}, resource = $resource(url,params,angular.extend(defaults,methods)), urlParams = {};
_.each(url.split(/\W/), function(param){
if (param && (new RegExp("(^|[^\\\\]):" + param + "\\W").test(url))) {
urlParams[param] = true;
}
});
// do not override if they did
if (!(methods||{}).get) {
resource.get = function (params,success,error) {
// look for multiples
var isMultiple = false;
_.each(params,function (val,key) {
if (key && urlParams[key] && angular.isArray(val)) {
isMultiple = true;
return(false);
}
});
return this[isMultiple?"getMultiple":"getSingle"](params,success,error);
};
}
return(resource);
};
}]).