Используя $resource.query, я хочу вернуть объект, содержащий массив фактического ресурса
По умолчанию параметр $resource.query()
настроен так, чтобы ожидать массив объектов, которые становятся объектами $resource
. Чтобы разместить пейджинг приятным, спокойным способом, у меня есть моя конечная точка GET /api/widgets
, настроенная для возврата следующего объекта:
{
currentPage: 1,
perPage: 20,
totalItems: 10039,
items: [{...}, {...}, {...}]
}
Есть ли способ сделать это так, чтобы angular знал, что свойство items
является массивом элементов, которые будут $resource
объектами?
Ответы
Ответ 1
Вам нужно указать свое собственное действие.
Я предполагаю, что ваш код выглядит примерно так:
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;
}
}
});
});
Ответ 2
проще было использовать $resouce.get
, если вы хотите использовать запрос, вы можете переопределить этот поведение.
$resource('/notes/:id', null,
{
'query': {method:'GET', isArray:false}
});
подробнее https://docs.angularjs.org/api/ngResource/service/ $resource
Ответ 3
У меня была такая же проблема, и я хотел предложить решение, которое может быть немного лучше:
factory('Widget', function($resource) {
return $resource(/api/widgets, null, {
query: {
interceptor: {
response: function(response) {
return response.data.items;
}
}
}
}
}
Я думаю, что это может быть лучше, потому что вы повторно используете стандартное поведение angular (которое на самом деле делает немного больше, чем fromJson
) и перехватывает результат вывода для фильтрации того, что вы хотите.
Ответ 4
Я использую этот шаблон для запроса с информацией подкачки.
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
};
})