2014-10-31 48 views
6

我試圖在我的角度應用程序上實現授權,當路線改變時我想檢查路線是否授權給用戶。我嘗試了$routeChangeStart,但它不能阻止事件發生。

我當前的代碼:

$scope.$on('$routeChangeStart', function(event, next, current) { 
     if(current_user.is_logged_in){ 
      var route_object = next.route_object; 
      if(!(route_object.route_roles)){ 
       event.preventDefault(); 
      } 
     } 
    }); 

在這裏,我next對象我得到route_object這是在我的$routeProvider

var routes = object; 
    app.config(function($routeProvider) { 
       $routeProvider.when(url, { 
        templateUrl: "/users.html", 
        route_object: routes, 
        }); 
      }); 

routes是這是在我的功能構成的物體設定,但是當我使用$locationChangeStart我只是獲取下一頁和上一頁的網址,

如何獲取整個路線對象?

回答

13

你可以得到的路由參數在$locationChangeStart事件監聽器是這樣的:

$scope.$on('$locationChangeStart', function(event, next, current) { 
    if(current_user.is_logged_in){ 
     var route_object = ($route.routes[$location.path()]).route_object; //This is how you get it 
     if(!(route_object.route_roles)){ 
      event.preventDefault(); 
     } 
    } 
}); 

那麼經典的preventDefault方法將做的工作。這是我爲類似的東西寫的plunker

+0

這實際上是爲我工作,但問題是'$位置。$$路徑'返回'/用戶',但在我的路線我有URL as'/ users /:id?' 因此,我收到一個錯誤。 – 2014-11-01 07:52:25

+0

什麼是錯誤? – 2014-11-03 01:01:25

+3

這不起作用。如果$ location.path是/ user/10,那麼找不到route/user /:id。 – r03 2015-01-07 12:13:43

0

下一個。$$路由包含什麼?

應該有一個未來$$ route.route_object

+0

裏面'$'locationChangeStart'是next'只是一個字符串。 – 2014-10-31 12:45:20

+2

不,不要使用$ locationChangeStart ... $ routeChangeStart是你想要的位置: '$ scope。$ on('$ routeChangeStart',function(event,next,current){ console.log JSON.stringify(下$$路線,NULL,4。)); 如果(current_user.is_logged_in){ VAR route_object =下一個$$ route.route_object;! 如果((route_object.route_roles)){ 事件.preventDefault(); } } });' – 2014-10-31 12:50:01

+0

Yaa可以工作,但是我不能阻止'$ routeChangeStart'裏面的事件 – 2014-10-31 12:51:47

0

您還可以使用$位置提供商要做到這一點,如:

.run(['$rootScope','$location',function($rootScope,$location){ 
     $rootScope.$on('$routeChangeStart', function(event,next, current) { 
     console.log('next',next); 
     console.log('location',$location.path()); 
     console.log('location',$location.search()); // for route params 
    }); 
    }])` 
1
$routeProvider 
     .when('/', { 
      title: 'Home', 
      templateUrl: 'partials/home', 
      controller: 'HomeController', 
      access: { 
       isFree: true 
      } 
     }) 
     .when('/about-us', { 
      title: 'About us', 
      templateUrl: 'partials/aboutus', 
      controller: 'AboutUsController', 
      access: { 
       isFree: true 
      } 
     }) 
     .when('/how-it-works', { 
      title: 'How It Works', 
      templateUrl: 'partials/howitworks', 
      controller: 'HowItWorksController', 
      access: { 
       isFree: true 
      } 
     }) 
     .when('/login', { 
      templateUrl: 'users/login', 
      controller: 'LoginController', 
      access: { 
       isFree: true 
      } 
     }) 
     .when('/logout', { 
      controller: 'LogoutController', 
      access: { 
       isFree: false 
      } 
     }) 
     .when('/sign-up', { 
      templateUrl: 'users/signup', 
      controller: 'SignUpController', 
      access: { 
       isFree: true 
      } 
     }) 
     .otherwise({ 
      redirectTo: '/' 
     }); 
}) 


.run(['$rootScope', '$location','$log','$window','Auth' ,function($rootScope, $location, $log, $window, Auth) { 

    $rootScope.$on('$routeChangeStart', function(event, currRoute, prevRoute){ 
     $rootScope.title = ''; 
     if(currRoute.$$route.title !== undefined){ 
      $rootScope.title = currRoute.$$route.title ; 
     } 
     // $rootScope.userLoggedIn = {name : 'Hi, '+ 'Amar'}  

     let checkIsLoggedInForRoute = ['/login','/sign-up']; 
     let isFreeAccess = currRoute.$$route.access.isFree; 
     let isLoggedIn = Auth.isLogin(); 

     if(isFreeAccess){ 
      if(checkIsLoggedInForRoute.indexOf($location.path()) !== -1 && isLoggedIn){ 
       event.preventDefault(); 
       $location.path('/') 
      } 
     }else if(!isFreeAccess){ 
      let isLogoutRoute = currRoute.$$route.originalPath.indexOf('/logout') !== -1; 
      if(isLogoutRoute && isLoggedIn){ 
       Auth.logout();   
       $location.path('/');  
      }else if(isLogoutRoute && !isLoggedIn){ 
       $location.path('/login'); 
      } 
     } 
    }); 
}]); 
+0

嗨,歡迎來到StackOverflow!這個答案如何改善已經存在的,被接受的答案? – 2017-04-12 07:53:32

+0

通過添加評論如何運行以及它如何改善提問者的狀況,可以提高此答案的質量。 – toonice 2017-04-12 08:05:40