Используя $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
    };
})