Я сражаюсь уже больше часа с довольно странной проблемой:
<mat-toolbar>
<mat-toolbar-row>
<ng-container *ngIf="!isSignedIn; else elseTemplate">
<button mat-button [matMenuTriggerFor]="signInOptions">
<i class="fas fa-sign-in-alt"></i>
</button>
<mat-menu #signInOptions="matMenu">
<button mat-menu-item>
<app-google-auth></app-google-auth>
</button>
</mat-menu>
</ng-container>
<ng-template #elseTemplate>
<button mat-button [matMenuTriggerFor]="userOptions">
<i class="fas fa-user"></i>
{{ signedInUser.displayName }}
</button>
<mat-menu #userOptions="matMenu">
<button mat-menu-item (click)="signOut()">
Sign Out <i class="fas fa-sign-in-alt"></i>
</button>
</mat-menu>
</ng-template>
</mat-toolbar-row>
</mat-toolbar>
... и кодом позади приведенного выше представления:
ngOnInit(): void {
const authStateChangedSubject = new BehaviorSubject<firebase.User>(null);
this.angularFireAuth.auth.onAuthStateChanged(
next => authStateChangedSubject.next(next),
error => authStateChangedSubject.error(error),
() => authStateChangedSubject.complete());
authStateChangedSubject.pipe(
tap(
firebaseUser => {
if (firebaseUser) {
this.isSignedIn = true;
this.signedInUser = firebaseUser;
} else {
this.isSignedIn = false;
}
}))
.subscribe();
}
Использование-Case # 1, действительный : пользователь НЕ вошел в систему;затем он или она проходит процедуру google-auth (с механизмом всплывающих окон, предоставляемым Firebase) и ng-if get обновляется мгновенно, как и ожидалось .
Use-Case # 2недопустимый : после того, как пользователь вошел в систему и обновил страницу - даже если console.log
сообщает, что isSignedIn
становится true
, как и ожидалось - никаких визуальных изменений не произойдет, пока пользователь не нажмет кнопку;только после того, как эта кнопка будет перерисована для правильной опции ng-if
.
Я далеко не англский гуру и не очень разбираюсь в механизме обнаружения изменений.SOS.