Получить значение, возвращаемое методом 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;
}
}
}