Выход из Firebase генерирует страницу входа

Я думаю, что это проще, если вы попробовали это

struct WorkshopModel:Decodable {
  let  responseCode: Int
  let  responseMessage:String
  let  Version: String  
  let  result:[WorkshopResult]
}

//

struct WorkshopResult:Decodable {
  let  name : String 
  let  workShops:[Workshop]
}

//

struct Workshop:Decodable{
   let   id:String
   let   timeschedule: String
   let   title: String
   let   showTimeEn: String
   let   ageEn: String
   let   durEn: String
   let   speakerEn: String
   let   locationEn: String
   let   workshopImg: String
}

//

do {
   let items = try JSONDecoder().decode(WorkshopModel.self, from: data)
   print(items.result)
}
catch {
  print(error)
}
0
задан 19 January 2019 в 15:37
поделиться

1 ответ

(Это весь рабочий код?) Помимо пользовательского сценария, когда происходит двойной щелчок (выход из системы и немедленный вход в систему), я не вижу ничего, что могло бы повторно инициировать вход в систему.

Вместо того, чтобы вручную устанавливать «isLoggedIn» в ваших методах входа / выхода, вы можете оставаться для этого подписанным на authState (подписка в вашем конструкторе уже делает большую часть этого, это должен быть ngOnInit). Использование authState для управления приводом является хорошей идеей, поскольку в случае сбоя входа или выхода из системы переменная isLoggedIn не будет синхронизирована с действительным authState.

ngOnInit() {
    this.afAuth.authState.pipe(
        tap((user: User | null) =>
            this.isLoggedIn = user !== null
        ),
    ).subscribe();
    // either store the subscription and unsubscribe in destroy,
    // or implement something like takeUntil and the subject to cancel on destroy
}

Если вы чувствуете, что пользовательский интерфейс меняется слишком быстро, вы можете добавить состояние загрузки, возможно, с принудительной задержкой, чтобы было понятно, что делает пользовательский интерфейс. В приведенном ниже примере пользовательское действие используется для установки состояния загрузки (в ожидании чего-либо), а подписка на состояние auth обновляет «isLoggedIn», а затем принудительно задерживает перед установкой состояния загрузки обратно в «ложь».

loadingSubject = new BehaviorSubject<boolean>(false);
loading$ = this.loadingSubject.asObservable();

isLoggedIn = false;

constructor(private afAuth: AngularFireAuth) {}

ngOnInit() {
    this.afAuth.authState.pipe(
        tap((user: User | null) =>
            this.isLoggedIn = user !== null
        ),
        delay(300),
        tap(() =>
            this.loadingSubject.next(false)
        ),
    ).subscribe();
    // either store the subscription and unsubscribe in destroy,
    // or implement something like takeUntil and the subject to cancel on destroy
}

login() {
    this.loadingSubject.next(true);
    this.afAuth.auth.signInWithPopup(new auth.GoogleAuthProvider());
}

logout() {
    this.loadingSubject.next(true);
    this.afAuth.auth.signOut();
}



<mat-progress-spinner *ngIf="loading$ | async; else buttons" [mode]="'indeterminate'"></mat-progress-spinner>

<ng-template #buttons>
    <button *ngIf="isLoggedIn" class="btn btn-danger" type="button" (click)="logout()">Log Out</button>
    <button *ngIf="!isLoggedIn" class="btn btn-danger" type="button" (click)="login()">Log In</button>
</ng-template>

0
ответ дан OneLunch Man 19 January 2019 в 15:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: