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 до этого. Знание, был ли Ресурс разрешен, полезно в привязке данных.

Другие вопросы по тегам