it-swarm.com.de

Ich möchte mit $ resource.query ein Objekt zurückgeben, das ein Array der aktuellen Ressource enthält

Standardmäßig ist $resource.query() so eingerichtet, dass ein Array von Objekten erwartet wird, aus denen $resource-Objekte werden. Um das Paging auf eine schöne, erholsame Weise zu ermöglichen, habe ich meinen GET /api/widgets-Endpunkt so eingerichtet, dass er das folgende Objekt zurückgibt:

{
  currentPage: 1,
  perPage: 20,
  totalItems: 10039,
  items: [{...}, {...}, {...}]
}

Gibt es eine Möglichkeit, es so zu machen, dass eckig weiß, dass die items-Eigenschaft das Array von Elementen ist, die $resource-Objekte sein sollen?

11
w.brian

Sie müssen Ihre eigene benutzerdefinierte Aktion angeben.

Ich stelle mir vor, Ihr Code sieht ungefähr so ​​aus:

factory('Widget', function($resource) {
  return $resource('/api/widgets');
});

Ändern Sie es zu diesem:

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

die einfache Lösung bestand darin, $resouce.get zu verwenden. Wenn Sie die Abfrage verwenden möchten, können Sie dieses Verhalten außer Kraft setzen. 

$resource('/notes/:id', null,
{
    'query':  {method:'GET', isArray:false}
});

weitere Informationen https://docs.angularjs.org/api/ngResource/service/ $ resource

2
bto.rdz

Ich hatte gerade das gleiche Problem und wollte eine Lösung vorschlagen, die etwas besser sein könnte:

factory('Widget', function($resource) {
    return $resource(/api/widgets, null, {
        query: {
            interceptor: {
                response: function(response) {
                    return response.data.items;
                }
            }
        }
    }
}

Ich denke, es ist vielleicht besser, weil Sie das Standard-Winkelverhalten wiederverwenden (was eigentlich etwas mehr ist als fromJson) und das Ausgabeergebnis abfangen, um zu filtern, was Sie wollen.

0
Edouard Berthe

Ich verwende dieses Muster für die Abfrage mit Paging-Informationen.

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