Компонент не воссоздает себя после выхода и входа - PullRequest
0 голосов
/ 24 мая 2019

В моем приложении 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 вызывается и запрашивает показы на основе нового вошедшего в систему пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...