2013-11-13 2 views
2

Я хочу выполнить некоторый код, как только я загружу ресурсы из моего внутреннего сервера. я был в состоянии сделать это с помощью обратного вызова на один запрос ресурсов, как это:AngularJS - Запустить код после загрузки нескольких ресурсов

$scope.resrc = Resrc.query({idResource: 1}, function(){ 
    //CODE AFTER RESOURCE IS LOADED 
}); 

Но пытаться использовать $ Q ждать несколько ресурсов для загрузки затем выполнить код не работает для меня! (Как они предлагают здесь https://stackoverflow.com/a/14545803/215945)

$q.all([ 
     $scope.services = Services.query({idResource: 1}), 
     $scope.brands = Brands.query({idResource: 1}) 
    ]).then(function() { 
     //CODE AFTER RESOURCES ARE LOADED 
}); 

Что я делаю неправильно?

+0

Как вы знаете, это не работает, то где ваш результат массив? – Shomz

ответ

12

От Angular documentation

Важно понимать, что вызов метода $ объекта ресурса немедленно возвращает пустую ссылку (объект или массив в зависимости от IsArray) , Как только данные возвращаются с сервера, существующая ссылка заполняется фактическими данными. Это полезный трюк, поскольку обычно ресурс присваивается модели, которая затем отображается в виде. Наличие пустого объекта не приводит к рендерингу, как только данные поступают с сервера, тогда объект заполняется данными, и представление автоматически повторно отображает себя, показывая новые данные. Это означает, что в большинстве случаев никогда не нужно писать функцию обратного вызова для методов действий.

Ключевым моментом здесь является то, что объект, который вы проходите, НЕ является обещанием.

Обещание - это способ сказать, что вы ждёте чего-то, чтобы закончить сначала. Это костяк ajax, и я бы рекомендовал прочитать его, если вы незнакомы.

Для того, чтобы $ Q работу вы должны будете дать обещание вместо объект или ссылку вместо

Из той же документации

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

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

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

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

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

Так что вам нужно будет сделать что-то вроде

$scope.services = Services.query({idResource: 1}); 
$scope.brands = Brands.query({idResource: 1}); 

$q.all([ 
    $scope.services.$promise, 
    $scope.brands.$promise 
]).then(function() { 
    //CODE AFTER RESOURCES ARE LOADED 
}); 
+0

Хотя оба ответа были одинаковыми, я нахожу ответ @kelaban гораздо более объяснительным, спасибо! –

2

Я думаю, что это потому, что объекты, которые возвращаются из звонков на $resource, не являются обещаниями. Я никогда не использовал эту функцию, но документация предполагает

$scope.services = Services.query({idResource: 1}); 
$scope.brands = Brands.query({idResource: 1}); 

$q.all([ 
    $scope.services.$promise, 
    $scope.brands.$promise 
]).then(function() { 
    //CODE AFTER RESOURCES ARE LOADED 
}); 
+0

Работал как очарование! Спасибо @akonsu –

Смежные вопросы