Angular.js $ ресурсный результат
Я обнаружил очень странное поведение Angular $resource. Пожалуйста, проверьте следующие строки кода:
class Service
constructor: ($resource) ->
service = $resource '/record/:id'
Service::list = (cb) ->
service.query().$promise.then (data) ->
#result: data == [e, $promise: Object, $resolved: true]
cb data
Service::get = (id, cb) ->
service.get(id:id).$promise.then (data) ->
#result: data == {id: 1, name: 'name' ...}
cb format data
Сервисный метод "get" возвращает правильное значение (объект), отправленный сервером, но метод "list" в качестве массива возврата результата, который содержит $promise и $resolved...
У кого-нибудь есть логическое объяснение?
ОБНОВИТЬ:
Я нашел проблему. Результатом службы является массив строк, которые приводят в результате к массиву строк. Это можно решить, используя $ http вместо $ resource.
Пример:
сторона сервера -> ['list', 'of', 'elements']
на стороне клиента -> ['l','i','s','t']
3 ответа
Если вы, как и я, хотели бы, чтобы ваш ответ дал вам данные без дополнительных $ обещаний и атрибутов $resolved, вы можете изменить ресурс и добавить "перехватчик", как описано здесь: http://docs.angularjs.org/guide/ миграция # ресурсные-обещания, которые-разрешенная-с-ресурсами инстанции
Для получения это будет выглядеть так:
var Resource = $resource('/url', {}, {
get: {
method: 'get',
interceptor: {
response: function(response) {
// expose response
return response;
}
}
}
});
Затем вы можете получить доступ к объекту ответа, а не к экземпляру ресурса при выполнении запроса get. Например:
Resource.get(function(response){
angular.forEach(response.data, function(value, key){
}, $scope.varName);
});
Это также означает, что вы можете получить доступ к другим атрибутам ответа, таким как response.status
, response.headers
а также получение экземпляра ресурса с response.resource
,
но метод "list" в качестве возвращаемого массива результата, который содержит $ обещание и $ resolved
Дважды проверьте это - как Chrome отображает массивы внутри console.log
когда массив имеет дополнительные свойства, вводит в заблуждение. Например, попробуйте следующее в консоли Chrome:
> a = [1, 2, 3]
> a.$promise = 'thing'
> a.$resolved = true
> a
[1, 2, 3]
> console.log(a)
[1, 2, 3, $promise: "thing", $resolved: true]
Как видите, в нем перечислены $promise
а также $resolved
как элементы массива, даже если они на самом деле не находятся в массиве.
Сама документация упоминает об этом и его использовании
Экземпляры и коллекции Resource имеют следующие дополнительные свойства:
$ обещание: обещание исходного взаимодействия с сервером, которое создало этот экземпляр или коллекцию.
В случае успеха обещание разрешается с помощью того же экземпляра ресурса или объекта коллекции, обновляемого данными с сервера. Это облегчает использование в разделе разрешения $routeProvider.when() для отсрочки рендеринга представления до тех пор, пока не будут загружены ресурсы.
При неудаче обещание разрешается с помощью объекта ответа http без свойства ресурса.
$ resolved: true после первого взаимодействия с сервером (с успехом или отклонением), false до этого. Знание, был ли Ресурс разрешен, полезно в привязке данных.