Получить значение, возвращаемое методом canActivate в Angular2 Route в компоненте?

Я создал Auth Manager в Angular2 для прямого ограничения доступа к компонентам. Я все еще новичок в изучении и изучении концепций.

Я смог ограничить пользователя, если имя пользователя неверно. Но я не могу использовать значение, возвращаемое методом canActivate в моем компоненте, для отображения сообщения в моем интерфейсе.

Мой класс AuthManager

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

@Injectable()

export class AuthManager implements CanActivate{

    user = "user";

    constructor(private router:Router){

    }

    canActivate(route:ActivatedRouteSnapshot,state:RouterStateSnapshot){
        console.log("Comes Here");
            if(this.user == "user"){
                return true;
            }else{
                console.log("YOur are not authorized");
                this.router.navigate(['/persons']);
                return false;
            }
    }
}

Я могу видеть, что вы не авторизованы в журнале, но как использовать значение в компоненте.

Мой app.router.ts

{
    path: 'persons/:id',
    component: PersonDetailComponent,
    canActivate:[AuthManager]       
    }

3 ответа

Что я понял под Вопросом, так это то, что вы хотите отобразить какое-то сообщение об ошибке для пользователя в случае сбоя аутентификации. @PierreDuc правильно. Но у меня другой подход к этому.

что вы можете сделать, это создать класс обслуживания

authenticate.service.ts

import {Injectable} from '@angular/core'

@Injectable()

export class AuthenticateService

    isAuthenticated(//take the user credentials here):boolean{
        return true // if the credentials are correct 

     or retun false // if the credentials donot match.    

    }

использовать этот класс в вашем компоненте и AuthManager

import { Injectable } from '@angular/core';
import { CanActivate,Router,ActivatedRouteSnapshot,RouterStateSnapshot } from '@angular/router';
import {AuthenticateService} from './authenticate.service'

@Injectable()

export class AuthManager implements CanActivate{

    user = "user";

    constructor(private router:Router,private authenticateService:AuthenticateService){

    }

    canActivate(route:ActivatedRouteSnapshot,state:RouterStateSnapshot){
        console.log("Comes Here");
           return  this.authenticateService.isAuthenticated();
    }
}

и в компоненте проверьте то же самое

this.authenticateService.isAuthenticated()== false
*ngIf and then display an error message to the user.

Надеюсь, это то, на что вы смотрите. это не совсем ответ на вопрос, а способ решить вашу проблему.

Вы можете использовать сервис и установить значение, которое вы хотите отобразить в компоненте внутри AuthManager.

Это довольно необычное занятие, но я понимаю, почему вы хотите что-то подобное. Однако невозможно получить результат, возвращенный из CanActivate,

Однако вы могли бы сделать ErrorService и подписать компонент на инициируемое событие, чтобы показать тостовое сообщение или что-то в этом роде.

непроверенный код впереди

@Injectable()
export class AuthManager implements CanActivate{

    user = "user";

    constructor(private router:Router, private errorService: ErrorService){}

    canActivate(route:ActivatedRouteSnapshot,state:RouterStateSnapshot){
       if(this.user == "user"){
            return true;
       } else{
           this.errorService.toastError("You are not authorized");
           this.router.navigate(['/persons']);
           return false;
       }
    }
}

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

export class ErrorService {

   public readonly error: Subject<string> = new Subject<string>(); 

   public toastError(error: string): void {
     this.error.next(error);
   }

}

После этого поместите компонент в свой AppComponent (или как вы считаете нужным) и сделайте что-то вроде этого:

@Component({
   selector : 'error-toast',
   template : `<div [innerHtml]="error" *ngIf="error"></div>`
})
export class ErrorToastComponent implements OnInit, OnDestroy { 

   public error: string = "";  

   private timeout: number = 0;

   private errorSub: Subscription;

   private readonly timer: number = 5000;

   constructor(private errorService: ErrorService) {}

   ngOnInit(): void {
      this.errorSub = this.errorService.subscribe((error: string) => {
          this.toastError(error);
      });
   }

   ngOnDestroy(): void {
      this.errorSub.unsubscribe();
      this.cancelTimer();
   }

   private toastError(error): void {
      this.cancelTimer();
      this.error = error;
      this.timeout = window.setTimeout(() => {
         this.error = "";
      }, this.timer);
   }

   private cancelTimer(): void {
      if(this.timeout !== 0) {
         clearTimeout(this.timeout);
         this.timeout = 0;
      }
   }

}
Другие вопросы по тегам