デフォルトでは、$resource.query()
は、$resource
オブジェクトになるオブジェクトの配列を期待するように設定されています。素敵で落ち着いた方法でページングに対応するために、次のオブジェクトを返すようにGET /api/widgets
エンドポイントを設定しています。
{
currentPage: 1,
perPage: 20,
totalItems: 10039,
items: [{...}, {...}, {...}]
}
angularがitems
プロパティが$resource
オブジェクトになるアイテムの配列であることを認識できるようにする方法はありますか?
独自のカスタムアクションを指定する必要があります。
あなたのコードは次のようになっていると思います。
factory('Widget', function($resource) {
return $resource('/api/widgets');
});
これに変更します:
factory('Widget', function($resource) {
return $resource(/api/widgets, null, {
query: {
method: 'GET',
isArray: true,
transformResponse: function(data) {
return angular.fromJson(data).items;
}
}
});
});
簡単なのは$resouce.get
を使用することでした。クエリを使用したい場合は、その動作をオーバーライドできます。
$resource('/notes/:id', null,
{
'query': {method:'GET', isArray:false}
});
詳細 https://docs.angularjs.org/api/ngResource/service/ $ resource
私は同じ問題を抱えていたので、もう少し良い解決策を提案したいと思いました。
factory('Widget', function($resource) {
return $resource(/api/widgets, null, {
query: {
interceptor: {
response: function(response) {
return response.data.items;
}
}
}
}
}
標準のangularの動作(実際には、fromJson
より少し多くのことを実行)を再利用し、出力結果をインターセプトして何をフィルタリングするので、より良いかもしれないと思いますあなたが欲しい。
このパターンは、ページング情報を使用したクエリに使用します。
module.config(function($resourceProvider){
$resourceProvider.defaults.actions.query = {
method: 'GET',
interceptor: {
response: function(response) {
response.resource.$totalCount = response.data.totalCount;
response.resource.$limit = response.data.limit;
response.resource.$offset = response.data.offset;
return response.resource;
}
},
transformResponse: function(data, headers, status) {
var out = angular.fromJson(data);
out.data.totalCount = out.totalCount;
out.data.limit = out.limit;
out.data.offset = out.offset;
return out.data;
},
isArray: true
};
})