Ресурс AngularJS не разрешен

Я новичок в AngularJS, поэтому будьте осторожны.

Я хочу получить данные из своего бэкэнда, используя свойство $resource AngularJS, однако кажется, что это свойство загружается до завершения фактического вызова.

В настоящее время у меня есть следующий код:

Контроллер:

MyApp.controller('IndexCtrl', function IndexCtrl($scope, socket, carsRes) {
    console.log(carsRes.cars.get());
    $scope.cars = carsRes.cars.get();
});

Фабрика

.factory('carsRes', function($resource) {
        var result = {};
        result.cars = $resource('/cars/:id', {}, {
            'get': {method: 'GET'},
            'save': {method: 'POST'},
            'query': {method: 'GET', isArray: true},
            'remove': {method: 'DELETE'},
            'delete': {method: 'DELETE'}
        });

        return result;
 });

Но в тот момент, когда я хочу сохранить carsRes.cars.get() в $scope.cars, вызов еще не завершен, и console.log сообщает мне, что $resolved по-прежнему ложно.

Как я могу дождаться разрешения вызова? Я кое-что читал о $q, но мне это не очень понятно.


person DirkZz    schedule 13.04.2013    source источник
comment
Покопавшись еще немного, я нашел кое-что, что работает: carsRes.cars.get(function(data){ $scope.cars = data.doc; }); Это правильное решение?   -  person DirkZz    schedule 13.04.2013


Ответы (1)


Это происходит потому, что resource.get() является асинхронным. Он немедленно возвращает пустую ссылку, а затем заполняется фактическими данными после завершения вызова ajax.

Лучший способ обработать результат — использовать функцию обратного вызова:

carsRes.cars.get(function(response){ 
    // We now have a completed ajax call, with the response
    $scope.cars = response;
});

Дополнительные примеры см. в документации $resource.

person jszobody    schedule 13.04.2013
comment
На самом деле, в отличие от $http, методы объекта ngResource не возвращают обещание: Важно понимать, что вызов метода объекта $resource немедленно возвращает пустую ссылку (объект или массив в зависимости от isArray). Как только данные возвращаются с сервера, существующая ссылка заполняется фактическими данными. - person joakimbl; 13.04.2013
comment
@joakimbl Спасибо за исправление! Я думал $http. Обновил ответ. - person jszobody; 14.04.2013
comment
Я также искал обещание на ngResource. Спасибо, что указали! Значит, вы также не можете разрешить маршрут с помощью ngResource? - person Maarten; 06.06.2013