2013-09-02 3 views
2

Я нашел очень странное поведение ресурса Angular $. Пожалуйста, проверка следующие строки кода:

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 

Сервис «получить» метод возвращает правильное значение (объект), посланный сервером, но «список», в качестве результата возврата массива, который содержит $ обещание и $ решен ...

У кого-нибудь есть логическое объяснение?

ОБНОВЛЕНИЕ:

Я нашел проблему. Результатом службы является массив строк, которые вызывают в качестве массива результатов строение символов. Это можно решить, используя $ http вместо $ resource.

Пример:

на стороне сервера -> [ 'список', 'из', 'элементов']

стороне клиента -> [ 'L', 'я', 'S', «т»]

ответ

0

documentation сам упоминает об этом, и его использование

экземпляры ресурсов и сбора имеют следующие дополнительные свойства:

$ Обещание: обещание первоначального взаимодействия с сервером, которое создало этот экземпляр или коллекцию.

При успешном выполнении обещание разрешается с помощью экземпляра экземпляра ресурса или объекта коллекции , обновленного данными с сервера. Это упрощает , чтобы использовать в разрезе раздел $ routeProvider.when() для отложенного просмотра рендеринга до загрузки ресурсов (ов).

При отказе обещание разрешено с помощью объекта ответа HTTP, без свойства ресурса.

$ resolved: true после завершения первого взаимодействия с сервером (либо с успехом, либо отклонения), перед этим. Знание того, был ли разрешен ресурс , полезен при привязке данных.

2

но «список», в качестве результата возврата массива, который содержит $ обещание и $ решена

Двойная проверка это - путь 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 в качестве элементов массива, даже если они на самом деле не в массиве.

+0

Hi Brandon. Благодарим вас за помощь и подсказку о контролере Chrome, но проблема вызвана ответом сервера ... – ikamatovic

+0

Есть ли у вас какие-либо источники, почему это так? Это ОЧЕНЬ вводит в заблуждение при попытке отладки ответов. – coblr

5

Если, как я, вы хотели бы ваш ответ, чтобы дать вам данные без дополнительных $ обещания и $ разрешенных атрибутов, которые вы можете изменить ресурс и добавить «перехватчик», как описано здесь: http://docs.angularjs.org/guide/migration#resource-promises-are-resolved-with-the-resource-instance

Для получить это будет выглядеть следующим образом:

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.