Я создал функцию закладки, которая, если пользователь нажимает на кнопку закладки, идентификатор пользователя будет сохранен в массив закладок документов в firebase, который работает нормально.
Но я хочу показать все закладки пользователя на странице / вкладке закладок (это новостной сайт, кстати, у документов есть заголовок, изображение, статья, закладки и т. Д.).
У меня это работает вручную
bookmarks$: Observable<lajmiId[]>;
bookmarksBehaviorSubject : BehaviorSubject<string|null>;
constructor(
private afs: AngularFirestore,
public authService: AuthService,
private ls: LoginService) {
this.bookmarksBehaviorSubject = new BehaviorSubject(null);
this.bookmarks$ = this.bookmarksBehaviorSubject.pipe(
switchMap(string => this.afs.collection<lajmiId>('lajmet', ref =>
ref.where('bookmarks', 'array-contains', 'manually_written_uid')).valueChanges())
);
}
Что работает, однако, когда я пытаюсь вставить uid динамически в зависимости от текущего вошедшего в систему пользователя, это не работает,
var uid = this.authService.userData.uid;
this.bookmarksBehaviorSubject = new BehaviorSubject(null);
this.bookmarks$ = this.bookmarksBehaviorSubject.pipe(
switchMap(string => this.afs.collection<lajmiId>('lajmet', ref =>
ref.where('bookmarks', 'array-contains', uid)).valueChanges())
);
Это дает мне ошибку undefined, поскольку он пытается прочитать uid до того, как данные будут готовы к использованию, поскольку данные асинхронны.
Я попытался поместить код в блок ngOnInit () с тем же результатом.
Я попытался создать наблюдаемую с данными UID все тот же результат.
я просто не могу понять это.
Мой authServise выглядит примерно так:
import { User } from '../core/user';
export class AuthService {
userData: Observable<any>;
constructor(
public afs: AngularFirestore, // Inject Firestore service
public afAuth: AngularFireAuth, // Inject Firebase auth service
public router: Router,
public ngZone: NgZone, //ngZone service to move outside scope warning
private dialogRef: MatDialog
) {
this.afAuth.authState.subscribe(user => {
if (user) {
this.userData = user;
localStorage.setItem('user', JSON.stringify(this.userData));
JSON.parse(localStorage.getItem('user'));
}
})
}
}
My User.ts содержит пользовательский интерфейс.
Любая помощь очень ценится.