2016-11-22 9 views
1

У меня есть система входа в систему, которая дает доступ к модулю тогда и только тогда, когда мы вошли в систему. Если мы этого не сделали, и наш сеанс истек, то я перенаправляюсь на страницу входа и сохраняю хранилище сеанса, где мы были, поэтому, если пользователь попытается снова войти в систему, он возвращается к странице, на которой он был. Однако, я имею вопрос в настороже:Angular2 Guard и маршрутизатор

@Injectable() 
export class AuthGuard implements CanActivate { 
    constructor(private _router: Router, private _authUtils: AuthUtils) {} 

    canActivate(): boolean { 
    if(this._authUtils.isLogged()) { 
     return true 
    } 
    else { 
     window.sessionStorage.setItem('previousPage', this._router.url) 
     let link = ["/login", { previous: "true" }] 
     this._router.navigate(link) 
     return false 
    } 
    } 
} 

Проблема исходит из того, что this._router.url еще не инициализирован, и, таким образом, возвращает «/» каждый раз. Если я заставляю его быть равным одному из моих маршрутов, то он отлично работает. Любая идея, как я могу исправить эту проблему?

Cheers!

EDIT:

Вот что я имею в мое приложение-routing.module.ts:

@NgModule({ 
    imports: [ 
     RouterModule.forRoot([ 
       { 
        path: 'myApp', 
        loadChildren: 'app/myApp.module#MyAppModule', 
        canActivate: [AuthGuard] 
       }, 
       { 
        path: 'login', 
        component: LoginComponent, 
        data: { 
         name: 'login' 
        } 
       }, 
       { 
        path: '**', 
        redirectTo: '/login', 
        pathMatch: 'full' 
       } 
      ] 
     ) 
    ], 
    exports: [ 
     RouterModule 
    ] 
}) 

export class AppRoutingModule {} 
+0

Пожалуйста, добавьте код в app.module, где вы возвещать AuthGuard. – Maxime

+0

Что вы хотите видеть там, я имею в виду, это просто появляется у моих провайдеров: as: AuthGuard – Scipion

ответ

0

Вы можете использовать RouterStateSnapshot от canActivate В параметре, чтобы получить текущий URL.

Пример Plunker.

Так что, я думаю, вы могли бы изменить ваш AuthGuard на:

import { 
    ActivatedRouteSnapshot, 
    RouterStateSnapshot, 
    CanActivate 
} from '@angular/router'; 

// other import .... 

@Injectable() 
export class AuthGuard implements CanActivate { 
    constructor(private _router: Router, private _authUtils: AuthUtils) {} 

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { 
    if(this._authUtils.isLogged()) { 
     return true 
    } 
    else { 
     window.sessionStorage.setItem('previousPage', state.url) 
     let link = ["/login", { previous: "true" }] 
     this._router.navigate(link) 
     return false 
    } 
    } 
} 

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

  • Нет связанных вопросов^_^