2015-07-07 3 views
0

Я новичок в AngularJS. Мне нужно сделать асинхронный внешний вызов (некоторый API) во время изменения маршрута и отобразить новое содержимое страницы, когда этот вызов возвращает какой-то действительный объект JS, скажем var MySpecialObject.Решить, когда обещание готово

Я бы отложил отображение нового вида до 3 секунд, но пока объект не будет готов. Поэтому, если я получаю объект за меньшее время - скорее, - я бы хотел показать новый контент немедленно.

1.Where - лучший способ инициировать вызов?

2. Как я могу отобразить новый вид, как только я получу этот объект?

Я пробовал использовать маршрут resolve. Ниже код - это то, с чего я начал успешно, но я не думаю, что он хорошо работает с решением «обещания». Как отобразить новое представление, как только объект возвращается на страницу? Другими словами, я хочу отменить таймаут, когда объект готов.

app.controller('PageCtrl', function($scope) { 
    $scope.$on('$routeChangeStart', function(next, current) { 
     //API call here 
    }); 

app.config(['$routeProvider', function ($routeProvider) { 
    $routeProvider 
    .when("/", {templateUrl: "partials/home.html", 
      controller: "PageCtrl", 
      resolve:{ 
         delay: function ($q, $timeout) { 
          var defer = $q.defer(); 
          $timeout(function() { 
           if(typeof MySpecialObject !== 'undefined') 
           defer.resolve('Resolve'); 
          }, 3000); 
          return defer.promise; 
         } 
        } 

      }) 

ответ

0

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

То, что вы хотите, может быть записано как:

app.config(['$routeProvider', function ($routeProvider) { 
     $routeProvider 
     .when("/", {templateUrl: "partials/home.html", 
       controller: "PageCtrl", 
       resolve:{ 
          yourData: function ($q) { 
           var defer = $q.defer(); 

           // do some work that will resolve the promise 

           return defer.promise; 
          } 
         } 

       }) 

и разрешенные данные могут быть введены в контроллер следующим образом:

app.controller('DestinationController', function($scope, yourData) { 
    $scope.data = yourData; 
}); 
+0

Я не слишком ясно, о том, как решить свое обещание. В моем случае решение включает в себя вызов и проверку действительного существования объекта JS. Где я могу подключить эту функцию в режиме «Угловой»? – Vad

+0

Куда вы звоните? У вас есть внешний сервис REST? Возможно, угловой сервис? – GPicazo

+0

Спасибо. Я не могу контролировать этот звонок. Я должен вызвать функцию, которая вызывает вызов Ajax, и единственная проверка успеха - это существование какого-либо объекта JS из ответа. – Vad

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