В моем приложении Ionic-Angular есть компонент, который при инициализации получает элементы из базы данных firestore через службу, а также получает текущего пользователя из коллекции firestore "users" также через службу. Затем, основываясь на полях профиля пользователя, шаблон компонента показывает только элементы, которые относятся к этим пользователям.
Все работает нормально, пока я не выйду из системы и не войду с другим пользователем. Кажется, NgOnInit больше не вызывается, поэтому новый подписанный пользователь имеет доступ к элементам предыдущего пользователя. После входа в систему маршрут направляется к компоненту элементов с router.navigateByUrl (маршрутизатор вводится).
Я попытался найти способ форсировать NgOnInit и нашел несколько ответов, в которых говорилось, что переход к этой странице должен вызываться внутри оператора this.zone.run (() => {} (вставлено NgZone), но это делает не работает. NgOnInit не вызывается.
export class MyRequestsPage implements OnInit {
status = 'progress';
requests$: Observable<RequestData[]>;
curr_user$: Observable<Users>;
assignedRooms: string[];
isLoading: Promise<boolean>;
@ViewChild(IonSegment) segment: IonSegment;
constructor(
private requestsService: RequestsService,
private loadingCtrl: LoadingController,
public authService: AuthService,
public firestore: AngularFirestore,
private toastCtrl: ToastController
) {}
ngOnInit() {
console.log('ngoninit my-requests');
this.segment.value = 'progress';
this.requests$ = this.requestsService.getRequests();
this.curr_user$ = this.authService.getCurrUser();
this.curr_user$.subscribe(x => {
this.assignedRooms = x.rooms;
console.log('assigned rooms are: ' + this.assignedRooms);
this.isLoading = Promise.resolve(true);
console.log('is loading: ' + this.isLoading);
});
}
Функции входа и выхода:
login(email: string, password: string) {
return this.http
.post<AuthResponseData>(
`https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key=${
environment.firebaseAPIKey
}`,
{ email: email, password: password, returnSecureToken: true }
)
.pipe(tap(this.setUserData.bind(this)));
}
logout() {
this._user.next(null);
Plugins.Storage.remove({ key: 'authData' });
}
private setUserData(userData: AuthResponseData) {
const expirationTime = new Date(
new Date().getTime() + +userData.expiresIn * 1000
);
this._user.next(
new User(
userData.localId,
userData.email,
userData.idToken,
expirationTime
)
);
this.getUserType(userData.localId);
this.storeAuthData(
userData.localId,
userData.idToken,
expirationTime.toISOString(),
userData.email,
this.userType,
this.userName,
this.userRoom
);
}
private storeAuthData(
userId: string,
token: string,
tokenExpirationDate: string,
email: string,
userType: string,
userName: string,
userRoom: string
) {
const data = JSON.stringify({
userId: userId,
token: token,
tokenExpirationDate: tokenExpirationDate,
email: email,
userType: userType,
userName: userName,
userRoom: userRoom
});
Plugins.Storage.set({ key: 'authData', value: data });
}
фактический результат: компонент MyRequestsPage не воссоздается заново - NgOnInit не вызывается.
ожидается: NgOnInit вызывается и запрашивает показы на основе нового вошедшего в систему пользователя.