取消路由并重定向到其他路由,而不在AngularJS中显示原始内容

时间:2013-08-15 15:31:45

标签: angularjs angularjs-routing

我想查看一个http服务,看看用户是否经过身份验证,以及是否有权在AngularJS 1.2.0rc1中查看某个页面(控制器)。

我有这种情况: 用户A想要访问http://www.example.com/content。现在,当他或她未经过身份验证时,无法访问此内容。如果用户未经过身份验证,则应将其重定向到http://www.example.com/login

现在我设法做到了这一点,但我简要地看到了内容页面的渲染html。我不想要这个。如何在不呈现内容页面的情况下重定向到登录页面?

我注册了我的路线:

$routeProvider.when('/login', route.resolve('Login', false))
$routeProvider.when('/content', route.resolve('Content', true))

现在我尝试过这个:

$rootScope.$on('$routeChangeStart', function (event, route) {
    if (route.requiresLogin) {
        $http.get('/api/user/loggedin/').then(function (response) {
            if (response !== 'true') {
                $location.path('/login');
            }
        });
    }
});

哪个有效,但我仍然看到其他页面(内容)的html内容闪烁。

我已经读过here您还可以尝试在解析路线时更改解析功能:

    var resolve = function (baseName, requiresLogin) {
    var routeDef = {};
    var dependencies = [routeConfig.getControllersDirectory() + baseName + 'Controller.js'];

    routeDef.templateUrl = routeConfig.getViewsDirectory() + baseName.toLowerCase() + '.html';
    routeDef.controller = baseName + 'Controller';
    routeDef.requiresLogin = requiresLogin;
    routeDef.resolve = {
        load: ['$q', '$rootScope', '$http', '$location', function ($q, $rootScope, $http, $location) {
            console.log(requiresLogin);
            if (requiresLogin) {
                return checkLoggedIn($q, $rootScope, $http, $location);
            } else {
                return resolveDependencies($q, $rootScope, dependencies);
            }
        }]
    };

    return routeDef;
}

但此处页面也会短暂显示。

希望你能帮助我。

1 个答案:

答案 0 :(得分:22)

第一个答案应该有效,但要使用$q来实现,我会使用defer.resolve()defer.reject("rejection_reason")然后我会在顶级控制器中监听$routeChangeError它绑定到routeProvider管理的ng-view之外的元素。

所以在您的HTML中,类似于:

<body ng-app="app" ng-controller="DocumentCtrl">
  <div ng-view>
  </div>
</body>

然后你的那条路线将被定义为:

when('/home', {
  templateUrl: templateUrl blah,
  controller: baseName + 'Controller',
  resolve: {
    load: function($q, MY_USER_SERVICE){
      var defer = $q.defer();
      if(~MY USER LOGGED_IN LOGIC RETURNS TRUE~){
        defer.resolve();
      } else {
        defer.reject("not_logged_in");
      }
      return defer.promise;

    }
  }
}).

然后我的DocumentCtrl控制器将包含:

$scope.$on("$routeChangeError", function(evt,current,previous,rejection){
  if(rejection == "not_logged_in"){
    //DO SOMETHING
  } else {
    //OR DO SOMETHING ELSE
  }
});

我正在运行上面的内容,并且没有任何不应加载的视图的闪存。