Я пытался правильно реализовать AuthGuard в моем веб-приложении. В настоящее время, когда я перемещаюсь в приложении, оно работает нормально. Но когда я обновляюсь, authService.loggedIn обрабатывается как ложное, прежде чем AuthService завершит выполнение.
Вот мой код:
auth.guard.ts
import {ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot} from '@angular/router';
import {Injectable} from '@angular/core';
import {AuthService} from './auth.service';
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private authService: AuthService, private router: Router) {
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
if (state.url === '/login') {
if (this.authService.loggedIn) {
this.router.navigate(['/']).then().catch();
} else {
return true;
}
} else {
if (this.authService.loggedIn) {
return true;
} else {
this.router.navigate(['/login']).then().catch();
}
}
}
}
auth.service
import {Injectable, OnInit} from '@angular/core';
import {AngularFireAuth} from '@angular/fire/auth';
import {auth} from 'firebase';
import {Router} from '@angular/router';
import {Subject} from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class AuthService implements OnInit {
loggedIn = false;
constructor(public afAuth: AngularFireAuth, private router: Router) {
this.afAuth.authState.subscribe((user) => {
if (user) {
this.loggedIn = true;
}
});
}
ngOnInit() {
}
...
}
Я исследую онлайн, и они упомянули другой подход
(например, https://gist.github.com/codediodeio/3e28887e5d1ab50755a32c1540cfd121), но не могу заставить его работать в моем приложении.
Одна ошибка, с которой я сталкиваюсь при попытке такого подхода, это «ОШИБКА в src / app / auth.guard.ts (20,8): ошибка TS2339: свойство« take »не существует для типа« Observable ».» Я использую
import {AngularFireAuth} from '@angular/fire/auth';
а не
import { AngularFireAuth } from 'angularfire2/auth';
Любая помощь / предложение приветствуется.
Спасибо всем.