2016-03-13 2 views
1

У меня есть приложение с 3-мя ссылками: Главная (/), Вход (/ пользователь/вход) и Детали пользователя (/ пользователь).Угловая 2 Отмена навигации по маршруту на UnAuthenticate

Когда пользователь нажимает Home, мое приложение будет показывать содержание общественного

Когда Detail пользователя нажмет пользователь, мое приложение будет показывать всплывающее окно входа, если пользователь отменить знак во всплывающем окне, мое приложение будет держать текущее местоположение, не изменять/пользователь.

Но я не знаю, как определить событие начала изменения маршрута и отменить это. Пожалуйста, помогите мне. Благодарю.

ответ

2

Я думаю, что вы можете расширить выход маршрутизатора для реализации такой обработки. Что-то вроде этого:

@Directive({ 
    selector: 'auth-outlet' 
}) 
export class AuthOutlet extends RouterOutlet { 
    publicRoutes: any; 
    private parentRouter: Router; 
    private authService: AuthService; 
    constructor(_elementRef: ElementRef, 
      _loader: DynamicComponentLoader, 
      _parentRouter: Router, 
      @Attribute('name') nameAttr: string, 
      _authService: AuthService) { 
    (...) 
    } 

    activate(oldInstruction: ComponentInstruction) { 
    var url = this.parentRouter.lastNavigationAttempt; 
    console.log('attemping to nav'); 
    if (!this.publicRoutes[url] && !this.authService.loggedIn){ 
     var newInstruction = new ComponentInstruction('Login', [], new RouteData(), Login, false, 1); 
     return super.activate(newInstruction); 
    } else { 
     return super.activate(oldInstruction); 
    } 
    } 
} 

Метод активации вызывается, когда будет отображаться маршрут. Вы можете добавить на этом уровне вашу обработку.

Вы можете использовать эту директиву таким образом ип ваш шаблон:

@Component({ 
    (...) 
    template: '<auth-outlet></auth-outlet>', 
    directives: [ AuthOutlet ] 
}) 
(...) 

Смотрите эти ссылки для получения более подробной информации:

Другой вариант заключается в использовании декоратор CanActivate, но он предназначен для каждого компонента и может не применяется во всем мире.

+0

пожалуйста, проверьте мой комментарий в вашем данной ссылке. Интересно, если он когда-либо возвращает url из var var = this.parentRouter.lastNavigationAttempt; ' – micronyks

+0

@ThierryTemplier Что это будет выглядеть сейчас для последнего маршрутизатора? 'ComponentInstruction' больше не существует, а' lastNavigationAttempt' не является открытым объектом на маршрутизаторе. Фактически, маршрутизатор имеет значение null внутри 'activate()'. – lbrahim

1

Для этого я реализую концепцию authService и до доступа к любому защищенному маршруту проверю, аутентифицирован ли пользователь или нет. Если пользователь не аутентифицирован, я перенаправляю его на страницу входа. Если вы хотите кнопку отмены тоже можно нажать кнопку отмены в LOGIN Component и при нажатии на нее вы можете перенаправить пользователя обратно на предыдущий компонент с помощью CanActive hook в элементе входа). Просто попробуйте узнать об этом, и если вы хотите получить дополнительную помощь, я здесь.

auth.ts

import {Observable} from 'rxjs/Observable'; 

export class Auth { 
    constructor() { 
    this.loggedIn = false; 
    } 

    login() { 
    this.loggedIn = true; 
    } 

    logout() { 
    this.loggedIn = false; 
    } 

    check() { 
    return Observable.of(this.loggedIn); 
    } 
} 

Для дальнейшей проверки кода из,

  • this plunker which is nicely written for protected routes
  • Эта реализация, несомненно, поможет вам для использования случая.

    1

    Неофициальное решение, которое я нашел, это бросить NavigationCancelingError через наблюдаемое или обещание. Угловой маршрутизатор поймает этот тип ошибки, отменит навигацию и сбросит текущий маршрут. Например, это может быть сделано в решимостью так:

    import { ActivatedRouteSnapshot, Resolve, Router } from '@angular/router'; 
    import { NavigationCancelingError } from '@angular/router/src/shared'; 
    import { Observable } from 'rxjs'; 
    
    export class CancelingResolve implements Resolve<any> { 
        constructor(private router: Router) {} 
    
        resolve(route: ActivatedRouteSnapshot): Observable<any> { 
         this.router.navigate(['new-route']); // Router will navigate here after canceling the activated route. 
         return Observable.throw(new NavigationCancelingError()); 
        } 
    } 
    

    Примечание: Работает под угловыми 2.3.1

    +0

    Где вы вводите этот класс? – Piou

    +0

    'НавигацияCancelingError' не нужно вводить. 'CancelingResolve' должно быть указано в свойстве' resolve' конфигурации маршрута. См. Https://angular.io/guide/router#resolve-pre-fetching-component-data. –

    +0

    Я не могу его вызвать. Я добавил, что создал самый верхний пустой маршрут со всеми моими маршрутами в качестве дочерних элементов, а свойство 'resolve: myResolver' и функция разрешения никогда не вызываются. – Piou

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