Как получить текущие пользователи "UID" в компоненте | Угловой 7 - PullRequest
0 голосов
/ 03 января 2019

Попытка сделать так, чтобы каждый пользователь мог создавать и читать свои собственные данные. Я работаю все так же, как в этом уроке, но он не работает, как там: https://angularfirebase.com/lessons/managing-firebase-user-relationships-to-database-records/

Моя база данных имеет следующую структуру:

 -|items
     -|userId
         -|itemId

Это мой сервис:

  userId: string;

  constructor(private db: AngularFireDatabase, private afAuth: AngularFireAuth) {
    this.afAuth.authState.subscribe(user => {
      if(user) this.userId = user.uid
    })
  }

И пример функции в службе, которая получает элементы из базы данных:

getRelays(): Observable<any[]> {
    if(!this.userId) return;
    this.relaysRef = this.db.list('relays/' + this.userId)
    return this.relaysRef.snapshotChanges().pipe(
      map(changes => 
        changes.map(c => ({ $key: c.payload.key, ...c.payload.val() }))
      )
    );
  }

Я хочу получить доступ к идентификатору текущего пользователя в компоненте, чтобы я мог получать элементы, основанные на текущем пользователе, но переменная userId работает только внутри подписки и возвращает неопределенное значение вне ее.

Вот так я могу войти и выйти (в другом компоненте):

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

logout() {
  this.afAuth.auth.signOut();
}

Спасибо за помощь!

Ответы [ 3 ]

0 голосов
/ 04 января 2019

Это потому, что наблюдаемые являются асинхронными.Поскольку данные пользователя вносятся асинхронно.UserId не будет доступен вне метода подписки.Таким образом, вам нужно написать логику внутри блока подписки, чтобы достичь желаемого результата.

this.afAuth.authState.subscribe(user => {
      if(user) this.userId = user.uid
      //you have to write the logic here.

    }) 
0 голосов
/ 04 января 2019

вы можете создать сервис, который будет хранить текущие данные пользователя.

interface IUser {
  id: number;
  name: string;
}

@Injectable()
export class CurrentUserService {
  user: IUser;
}

где-нибудь в вашем коде авторизации firebase:

whenLoggedIn(user: IUser) {
  this.currentUserService.user = user;
}

Компонент

constructor(public currentUserService: CurrentUserService) {}

Шаблон

{{ currentUserService.user.id }}
0 голосов
/ 03 января 2019

проблема, с которой вы столкнулись, потому что вы подписываетесь на наблюдаемое и всякий раз, когда он замечает какие-либо изменения, он получает некоторые данные с идентификатором и изменяет значение «uid».лучший способ справиться с этим - хранить файл responsece.uid в локальном хранилище и получать этот идентификатор в любое время из локального хранилища.как это

 this.api.getUser(res.user.uid).subscribe(resp => {
    if (resp) {
      localStorage.setItem('uid', res.user.uid);
      localStorage.setItem('email', this.user.email); })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...