0

在我的 AngularJS 应用程序中,每次请求更改我运行的页面:

    $rootScope.$on('$locationChangeStart', function (event, next, current) {
        var user;
        $http.get('/api/Authentication/UserAuthenticated').then(function (data) {
        console.log("call");
         user = data.data;
       });   
      console.log("end of call");
    });

当我运行应用程序并测试正在发生的事情时,我在控制台中看到“通话结束”之前返回,console.log("call");这意味着未设置用户。这意味着如果我想检查用户是否在更改路由时登录,用户将是未定义的。

我如何让 Angular 运行-> http 请求,然后才能继续?

4

2 回答 2

1

我有点误解了这个问题。您可以让$routeProvider解决$http承诺:

var app = angular.module("myApp");

app.config(["$routeProvider", function($routeProvider) {
  $routeProvider.when("/",{
    templateUrl: "myTemplate.html",
    controller: "MyCtrl",
    resolve: {
      user: ["$http", "$q", function($http, $q) {
        var deferred = $q.defer();
        $http.get('/api/Authentication/UserAuthenticated').success(function(data){
           deferred.resolve(data.data);
        }).error(function(error) {
           deferred.resolve(false);
        });
        return deferred.promise;
      }]
    }
  });
}]);

如果获取用户数据的代码过于复杂,您可以为其创建一个服务,并将该服务注入到$routeProvider'sresolve函数中。

在您的控制器中,您只需注入承诺(将被解决):

app.controller("MyCtrl",["$scope","user", function($scope, user) {
   if (!user) {
      alert("User not found");
   }
...
}]);
于 2014-02-26T11:30:34.833 回答
0

使用async:false. 它对我有用

试试这个代码,而不是你的代码

$rootScope.$on('$locationChangeStart', function (event, next, current) {
$http({method: 'GET',
            url: '/api/Authentication/UserAuthenticated',                
            async: false
              }).success(function (data) {
            console.log("call");
            user = data.data;
             }
         console.log("end of call");   
 });
于 2014-02-26T11:15:25.377 回答