Получить значение, возвращаемое в Observable <any>в Angular Typescript (Firebase) - PullRequest
0 голосов
/ 13 сентября 2018

Итак, у меня есть следующий код для извлечения данных из моего списка пользователей Firebase:

currentUserRef: AngularFireList<any>
currentUser: Observable<any>;

var user = firebase.auth().currentUser;

this.currentUserRef = this.af.list('usuarios', ref =>
ref.orderByChild('email').equalTo(user.email));
this.currentUser = this.currentUserRef.valueChanges();
this.currentUser.subscribe(res => console.log(res[0].condominio));

Внутри полученных данных у меня есть два свойства: condominio и email.

Onconsole.log (res [0] .condominio) У меня есть данные, выведенные на консоль, но мне нужно сохранить их в переменной, например:

userCond: string;

Затем я должен получить свойство 'condominio'из res и установите его в' userCond ', но если я попытаюсь сделать это, он не будет работать:

this.currentUser.subscribe((res) => { this.userCond = res[0].condominio });

Что я делаю не так?

"angularfire2": "^5.0.0-rc.11",
"firebase": "^5.3.1",
"ionic-angular": "3.9.2",

РЕДАКТИРОВАТЬ:

    export class HomePage {

    currentUserRef: AngularFireList<any>
    currentUser: Observable<any>;

    moradorRef: AngularFireList<any>
    morador: Observable<any>;

   userCond: string;

   constructor(
    public authService: AuthService,
    public userService: UserService,
    public navCtrl: NavController,
    public navParams: NavParams,
    public af: AngularFireDatabase
   ) {

   }

   ionViewCanEnter(): Promise<boolean> {
     return this.authService.authenticated;
   }

   ionViewDidLoad(){
    debugger;
    //TRAZ AS MESMAS INFORMAÇÕES
    //this.userService.getCurrentUser();
    var user = firebase.auth().currentUser;

    //const _this = this;

    this.currentUserRef = this.af.list('usuarios', ref =>
    ref.orderByChild('email').equalTo(user.email));
    this.currentUser = this.currentUserRef.valueChanges();
    //this.currentUser.subscribe(res => 
    console.log(res[0].condominio));
    this.currentUser.subscribe(res => {
      debugger;
      this.userCond = res[0].condominio;
    });

    console.log(this.userCond);

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

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

this.currentUser.subscribe(res => {
  this.userCond = res[0].condominio;
  this.loopOverAnotherList();
});

loopOverAnotherList() {
   // you can use this.userCond here
}
0 голосов
/ 13 сентября 2018

Определите userCond как наблюдаемое.

userCond: Observable<string>;

Позже, сопоставьте значение свойства condominio с userCond при запросе к пожарному депо.

this.currentUserRef = this.af.list('usuarios', ref =>
                              ref.orderByChild('email').equalTo(user.email));
this.userCond = this.currentUserRef.valueChanges()
                                       .pipe(map(res => res[0].condominio));

Теперь на userCond можно подписаться, чтобы получить значение, когда это необходимо.

0 голосов
/ 13 сентября 2018
  this.currentUser.subscribe(res => {
    this.userCond = res[0].condominio; // 'this' here refers to the observable, not the class instance
  });

Чтобы справиться с этим, выполните:

  const _this = this;
  this.currentUser.subscribe(res => {
    _this.userCond = res[0].condominio;
  });
...