web-dev-qa-db-fra.com

Avec $ resource.query, je veux renvoyer un objet contenant un tableau de la ressource réelle.

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?

11
w.brian

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;
      }
    }
  });
});
23
Remco Haszing

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

2
bto.rdz

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.

0
Edouard Berthe

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
    };
})
0
Martin Mytny