2016-12-07 65 views
0

我需要創建一些有限制的頁面,並且我的代碼可以正常工作,但是當我嘗試訪問具有ID的頁面時無法工作並自動將我重定向到登錄頁面。誰能告訴我爲什麼?AngularJs - 創建公共頁面和限制頁面

function run($rootScope, $http, $location, $localStorage) { 
    // keep user logged in after page refresh 
    if ($localStorage.currentUser) { 
     $http.defaults.headers.common.Authorization = 'Bearer ' + $localStorage.currentUser; 
    } 


    // redirect to login page if not logged in and trying to access a restricted page 
    $rootScope.$on('$locationChangeStart', function (event, next, current, Auth) { 
     var publicPages = ['/login','/','/job','/job/:jobId']; 
     var restrictedPage = publicPages.indexOf($location.path()) === -1; 
     if (restrictedPage && !$localStorage.currentUser) { 
      $location.path('/login'); 
     } 
    }); 
} 

我的配置

.when("/job" , { 
     templateUrl: "app/components/job/views/job.html", 
     controller: "job" 
    }) 
    .when("/job/:jobId" , { 
     templateUrl: "app/components/job/views/jobdetail.html", 
     controller: "job_detail" 
    }) 

回答

0

我覺得你的公共頁面驗證是錯誤的。

路徑/job/:jobId只是一個路由。 調用$location.path()返回參數被替換的當前路徑,因此返回/job/1,這不在publicPages數組中。我也推薦使用ui router。它讓你的生活變得更加簡單,並且有很多教程如何使用它(例如Handling basic route authorization in AngularJS

+0

當我把location.path我有值,但我不能把我的陣列。 –

+0

我知道。這就是我建議你重新考慮你目前的做法的原因。看看我在我的答案中插入的鏈接。 – Danscho

0

如果您使用的是ui.router,那麼您可以按如下方式實施可擴展的解決方案。在這個例子中,任何啓動應用的狀態都需要認證。使用[email protected]作爲電子郵件的密碼登錄到應用程序123. ui.router鉤子訣竅!

.run(($transitions, $state, $injector) => { 
    $transitions.onBefore({ 
     to: 'app.**' 
    },() => { 
     const $window = $injector.get('$window'); 
     if (!$window.sessionStorage.getItem('user')) { 
     return $state.target('login', $state.transition.params()); 
     } 
     return true 
    }); 
    }); 

https://plnkr.co/edit/ZCN2hB34mMEmBJulyaAJ?p=preview