Я хочу сделать запрос на основе текущего идентификатора пользователя, вошедшего в Angular, используя firebase в качестве моего бэкенда - PullRequest
0 голосов
/ 29 мая 2019

Я создал функцию закладки, которая, если пользователь нажимает на кнопку закладки, идентификатор пользователя будет сохранен в массив закладок документов в 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 содержит пользовательский интерфейс.

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 29 мая 2019

В вашей службе аутентификации вам нужно сделать пользователя наблюдаемым, а затем вы можете легко подписать его на ngOnInit.

Предположим, ваш auth.service.ts

export class AuthService{
   user$:Observable<any>;
 constructor(private router: Router,
          private afAuth: AngularFireAuth,
          private db:AngularFirestore,
          ) {
            this.user$ = this.afAuth.authState.pipe(
              switchMap(user => {
                if (user) {
//here you get the logged in user cred like uid
//you can use uid to refer in your collection
                  return this.afs.collection<lajmiId>(`lajmet/${user.uid}`).valueChanges()
                } else {
                  return of(null)
                }
              })
            )
          }
}

Это всегда даст вам имя текущего вошедшего в систему пользователя, после чего вы сможете легко подписаться после импорта вашего authservice в компонент, который вы пытаетесь получить.

this.authService.user$.take(1).subscribe(data=>{
//data of the user logged in
})
...