кажется, что я ударил стену, когда в моем понимании наблюдаемых, AngularFireAuth и firebase аутентификации. Вот фрагмент моей службы аутентификации
export class AuthService {
user$: Observable<firebase.User>;
constructor(
private db: AngularFirestore,
private fireAuth: AngularFireAuth,
) {
this.user$ = fireAuth.authState.pipe(
switchMap(user => {
if (user) {
return this.db.doc<User>(`users/${user.uid}`).valueChanges();
} else {
return of(null);
};
})
);
}
Это хорошо работает для меня с моими методами входа в систему и выхода из системы, которые у меня есть в шапке. Я могу подписаться на канал asyn c и отобразить кнопку входа в систему, если пользователь вышел из системы, и некоторую информацию о пользователе, если вошли в систему.
Header.component. html
<div *ngIf='!(auth.user$ | async )'>
<button
class="login"
(click)="openModal()"
>
Login
</button>
</div>
<div *ngIf='auth.user$ | async as user'>
<h3>Welcome, {{ firstName( user.displayName) }}! </h3>
<img [src]='user.photoURL'
class='profile'
*ngIf='user.photoURL'>
<button (click)="auth.signOut()">Logout</button>
</div>
Теперь в своей кассе я создал форму доставки, которую я хочу показать только в том случае, если пользователь вошел в систему. Я также планировал извлечь идентификатор клиента с полосой из firebase, чтобы добавить его в свой объект orderData. Все работало отлично, пока я не сменил маршруты на страницу продукта и не вернулся к оформлению заказа. Когда я делаю это, пользователь выходит из системы, форма исчезает, а stripeId из пользовательской подписки $ исчезает. У меня такой же логин c в моей кассе, как и в моем заголовке.
Checkout.component. html
<div *ngIf="!(auth.user$ | async)">Please register</div>
<form [formGroup]='orderForm' *ngIf="auth.user$ | async">...</form>
В моем компоненте кассы я подписан на пользователя $ и консоль записывают значение в ngOnInit (). Когда я делаю это, на странице refre sh печатаются два значения, а когда я меняю маршруты и возвращаю, ничего не печатается.
constructor(
public auth: AuthService,
public stripePayment: PaymentService,
private cart: CartService
) {
//this.auth.user$.subscribe( user => this.userData = user)
}
ngOnInit(){
this.auth.user$.subscribe( data => console.log(data) )
}
Я пытался создать методы в authService и компоненте для извлечения и извлечения данных, и он либо работает при загрузке первой страницы, либо только при возврате из изменения маршрута.
Я попытался изменить свой код в службе аутентификации, чтобы изменить take (1), это заставило работать форму заказа. После изменения маршрута и при входе в систему. Однако компонент заголовка перестал работать, и информация о пользователе не изменится при входе в систему.
user$: Observable<firebase.User>;
constructor(
private db: AngularFirestore,
private fireAuth: AngularFireAuth,
) {
this.user$ = fireAuth.authState.pipe(
take(1),
switchMap(user => {
if (user) {
return this.db.doc<User>(`users/${user.uid}`).valueChanges();
} else {
return of(null);
};
})
);