2016-08-23 3 views
0

Здравствуйте у меня есть простой LoginService, который выглядит так:angularjs, ждать результата авторизации, прежде чем перейти к следующим контроллерам

this.notifyAuthorization = function() { 
    console.log('notifyAuthorization()'); 

    $http({ 
     url: 'app/?cmd=authorization/', 

    }).then(function (response) { console.log('LoginStatusResult: '); console.log(response.data); 
     var data = response.data; 

     if(data.hash !== undefined) { 
      $rootScope.loginStatus= true; 
      hash = data.hash; 
     } 
    }); 
}; 

здесь призыв к службе

app.run(function($rootScope, $location, LoginService) { 
    LoginService.notifyAuthorization(); 
    console.log('notifyAuthorization Finished'); 
}); 

Перед увидеть LoginStatusResult я вижу notifyAuthorization Finished и другие контроллеры инициализируются, чтобы знать LoginStatus так, как это решить? или есть лучшая практика? Благодаря

+0

Это потому, что 'notifyAuthorization()' является асинхронной функцией, что означает, что она не блокирует остальную часть кода до его завершения. Вы можете решить эту проблему, используя ** обещания **. Проверьте службу [$ q] (https://docs.angularjs.org/api/ng/service/$q). – byxor

ответ

2

Используйте promises, которые предоставляются по умолчанию вашей функции $ HTTP:

this.notifyAuthorization = function() { 

    return http({ //notice the return inserted here 
     url: 'app/?cmd=authorization/', 

    }).then(function (response) { console.log('LoginStatusResult: '); console.log(response.data); 
     var data = response.data; 

     if(data.hash !== undefined) { 
      $rootScope.loginState = true; 
      hash = data.hash; 
     } 
    }); 
}; 

и использовать его должным образом в вашем app.run:

app.run(function($rootScope, $location, LoginService) {  
    LoginService.notifyAuthorization().then(function(){ 
     $rootScope.authorized = true;; //executed after your $http request... 
    }); 
}); 

и в вашем HTML код:

<div ng-controller="myController" ng-if="$root.authorized"> 
    <!-- your inner code.. 

     <p>Pellentesque habitant morbi tristique senectus et netus et     
     malesuada fames ac turpis egestas. Vestibulum tortor quam, 
     feugiat vitae, ultricies eget, tempor sit amet, ante. </p>    
    --> 
</div> 

Таким образом, ваш контроллер будет включен ed только после того, как функция .then была разрешена.

+0

его вид тот же для меня, потому что мне нужно знать LoginStatus перед инициализацией контроллеров. –

+0

Затем добавьте переменную ng-if в свою функцию notifyAuthorization. см. мой обновленный ответ для деталей. – Luxor001

+0

скажем, у меня есть LoginController, который мне НЕ нужно вызывать, если 'root.authorized' TRUE, по умолчанию' root.authorized' является FALSE, поэтому он будет вызывать LoginController, а затем, когда результат будет получен NG -IF это скроет контроллер, что я могу сделать в этой ситуации? –

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