Как изменить данные, возвращаемые $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(), но Я не уверен, куда идти оттуда.
Ответы
Ответ 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"...!