Хорошо, есть один сценарий, который не был обработан вашим кодом.Что если user
не определено в firebase.auth().onAuthStateChanged
?Ваш this.adAllListRef
не будет инициализирован, и поэтому вы получите ту же ошибку и в этом случае.
Возможно, я не смогу дать рабочий код, но я могу предложить вам подход к обработкеэто:
Так как эта страница работает только тогда, когда user
является действительным, поэтому попробуйте использовать AuthGuard , который может выглядеть примерно так:
import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router, Route } from '@angular/router';
import { Observable } from 'rxjs';
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private _router: Router,private _advSvc: AdvertisingService) {
}
canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean>
{
return new Promise((resolve) => {
firebase.auth().onAuthStateChanged(user => {
if (user) {
resolve(true);
}else{
this._router.navigate(['/login']);
resolve(false);
}
});
}
}
в AdvertisingService , вам не нужно проверять user
, потому что он вызывается только потому, что AuthGuard
подтвердил пользователя.
export class AdvertisingService {
constructor() {
}
getAdAllList(): firebase.firestore.CollectionReference {
return firebase.firestore().collection(`/adverts/adAll/adList`);
}
}
и определите router
как:
const route = [
{ .... },
{path: '/home',component: HomeTabPage, canActivate: [AuthGuard] },
{path: '/login',component: LoginPage }
]