Par défaut, la $resource.query()
est configurée pour s’attendre à un tableau d’objets qui deviennent des objets $resource
. Pour permettre la pagination de manière agréable et reposante, mon point de terminaison GET /api/widgets
est configuré pour renvoyer l'objet suivant:
{
currentPage: 1,
perPage: 20,
totalItems: 10039,
items: [{...}, {...}, {...}]
}
Existe-t-il un moyen de faire en sorte qu'angular sache que la propriété items
est le tableau d'éléments devant être des objets $resource
?
Vous devez spécifier votre propre action personnalisée.
J'imagine que votre code ressemble à quelque chose comme ça:
factory('Widget', function($resource) {
return $resource('/api/widgets');
});
Changez-le en ceci:
factory('Widget', function($resource) {
return $resource(/api/widgets, null, {
query: {
method: 'GET',
isArray: true,
transformResponse: function(data) {
return angular.fromJson(data).items;
}
}
});
});
le plus simple était d'utiliser $resouce.get
; si vous souhaitez utiliser une requête, vous pouvez remplacer ce comportement.
$resource('/notes/:id', null,
{
'query': {method:'GET', isArray:false}
});
plus d'infos https://docs.angularjs.org/api/ngResource/service/ $ resource
Je viens d'avoir le même problème et je voulais proposer une solution qui pourrait être un peu mieux:
factory('Widget', function($resource) {
return $resource(/api/widgets, null, {
query: {
interceptor: {
response: function(response) {
return response.data.items;
}
}
}
}
}
Je pense que cela pourrait être mieux, parce que vous réutilisez le comportement angulaire standard (qui fait, en fait, un peu plus que fromJson
) et que vous interceptez le résultat en sortie pour filtrer ce que vous voulez.
J'utilise ce modèle pour une requête avec des informations de pagination.
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
};
})