Как получить значение из AngularFireObject

#angular

#angular

Вопрос:

Я изучаю Angular, создавая базовое приложение, в котором я застрял при выполнении операции с БД.

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

 getUser(uid : String) : AngularFireObject<AppUser> {
    return this.db.object('/users/' uid);
  }
 

Я вызываю вышеуказанную функцию из метода canActivate, где мне нужно получить пользователя и вернуть свойство (return user.isAdmin, логическое свойство) пользовательского объекта. итак, я добавил приведенный ниже код

  canActivate() :  Observable<boolean>{
    return this.auth.user$.map(user =>  this.userService.getUser(user.uid)).map( appUser => appUser.isAdmin);
  }
 

В приведенном выше коде я не могу вызвать AppUser.isAdmin. можете ли вы, пожалуйста, помочь мне вернуть свойство isAdmin из метода canActivate. Выдается следующая ошибка

 Property 'isAdmin' does not exist on type 'AngularFireObject<AppUser> 
 

Предложите лучшее решение, пожалуйста

Комментарии:

1. Пожалуйста, укажите фактический фреймворк, который вы используете. angularjs является тегом для фреймворка AngularJS 1.x. angular предназначен для фреймворка Angular 2 .

Ответ №1:

Вы не можете этого сделать appUser.isAdmin , потому appUser что это не AppUser тот тип, в котором я предполагаю, что это isAdmin свойство. В соответствии с этой функцией,

 getUser(uid : String) : AngularFireObject<AppUser> {
    return this.db.object('/users/' uid);
  }
 

возвращаемый тип AngularFireObject . Пожалуйста, следуйте решению Джози, чтобы вернуть наблюдаемый объект, который даст вам AppUser объект при подписке.

Ответ №2:

После прочтения некоторой документации AngularFire, я думаю, вам нужно включить свой

 getUser(uid : String) : AngularFireObject<AppUser> {
    return this.db.object('/users/' uid);
  }
 

в

 getUser(uid : String) : Observable<AppUser> {
    return this.db.object('/users/' uid).valueChanges();
  }
 

И тогда вы бы подписались на наблюдаемое как обычно.

Комментарии:

1. спасибо за вашу помощь !! .. вы сказали, что возвращаете valuechanges … но метод valuechanges возвращает Наблюдаемый< {}> не наблюдаемый<AppUser>

2. Вы пытались подписаться после вышеуказанных изменений кода? Это будет выглядеть примерно так canActivate() : boolean{ this.auth.user$.map(user => this.userService.getUser(user.uid)).subscribe(appUser => { return appUser.isAdmin; }); } , или вы говорите, что вы сделали выше, и он возвращает пустой объект?

3. Или вы можете сохранить возвращаемый объект в любом компоненте, вызывающем getUser() . Что-то вроде var user: AppUser; , а затем в ngOnInit() { this.auth.user$.map(user => this.userService.getUser(user.uid)).subscribe( appUser => {this.user = appUser}); Тогда вы можете просто проверить свойство user.isAdmin