#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