Подтвердить что ты не робот

Как изменить данные, возвращаемые $resource в Angular.js?

Я использую API, который возвращает данные JSON в этом формате:

{
    paging: {
        previous: null,
        next: null
},
    data: [
        { title: 'First Item' },
        { title: 'Second Item' },
        ...
    ]
}

Я использую Angular $resource для получения этих данных.
Мой код, который находится в контроллере, выглядит примерно так:

var Entity = $resource('/api/entities');
var entities = $scope.entities = Entity.get();

И затем, в представлении, я могу отобразить данные следующим образом:

<ul>
  <li ng-repeat="entity in entities.data">{{entity.title}}</<li>
</ul>

Все работает отлично, но:

  • Я предпочел бы только представление entities.data для представления вместо всего объекта entities. Как перехватить данные, возвращаемые запросом GET, чтобы изменить его до, он заполняет $scope.entities?
  • Коррелированный вопрос: поскольку я извлекаю массив данных, было бы проще использовать Entity.query() вместо Entity.get(). Но если я использую Entity.query() в приведенном выше коде, я получаю сообщение об ошибке "TypeError: Object # не имеет метода" push ". Это имеет смысл, так как API возвращает объект вместо массива (следовательно, на объект не существует метода push). Опять же, если бы я мог извлечь атрибут .data из ответа, у меня был бы массив.

Следуя этим показаниям Dan Boyon, мне удалось настроить службу по умолчанию $resource и переопределить методы .get() или .query(), но Я не уверен, куда идти оттуда.

4b9b3361

Ответ 1

Я не думаю, что вам нужно изменить настройки get или query по умолчанию. Просто используйте обратный вызов успеха, чтобы делать то, что вы хотите. Он также должен быть более надежным.

Entity.get(
    {}, //params
    function (data) {   //success
        $scope.entities = data.data;
    },
    function (data) {   //failure
        //error handling goes here
    });

Html также будет более чистым:

 <ul>
      <li ng-repeat="entity in entities">{{entity.title}}</<li>
 </ul>

Кстати, я обычно объявляю службы для своих ресурсов, а затем вставляю их в свои контроллеры, когда они мне нужны.

 myServices.factory('Entity', ['$resource', function ($resource) {
     return $resource('/api/entities', {}, {
     });
 }]);

Ответ 2

Вы можете использовать Response Transformer (transformResponse) следующим образом:

$resource('/api/entities', {}, {
        query: {
            method: 'GET',
            responseType: 'json',
            isArray: true,
            transformResponse: function (response) {
                return response.data;
            }
        }
    });

Этот код изменяет поведение метода запроса, вы можете сделать то же самое для "get"...!