Как получить значение от конструктора сервиса в сервисе angular2
Я пытаюсь разработать Auth Service. Я использую это:
@Injectable()
export class AuthService {
authState: any = null;
constructor(private afAuth: AngularFireAuth,
private db: AngularFireDatabase,
private router:Router) {
this.afAuth.authState.subscribe((auth) => {
this.authState = auth;
});
}
// Returns true if user is logged in
get authenticated(): boolean {
return this.authState !== null;
}
Функция authenticated() продолжает выдавать мне false, даже если пользователь вошел в систему.
Когда я console.log authState (this.authState) в конструкторе, я получаю значение, но вне конструктора this.authState имеет значение null. Что я делаю неправильно?
3 ответа
Вы можете использовать APP_INITIALIZER, чтобы дождаться завершения асинхронной операции. Пожалуйста, проверьте следующий код:
AuthService.ts
@Injectable()
export class AuthService {
authState: any = null;
constructor(private afAuth: AngularFireAuth,
private db: AngularFireDatabase,
private router:Router) {
}
loadValue(){
return new Promise((resolve, reject) => {
this.afAuth.authState.subscribe((auth) => {
this.authState = auth;
resolve(true);
});
});
}
// Returns true if user is logged in
get authenticated(): boolean {
return this.authState !== null;
}
}
app.module.ts
import { NgModule, APP_INITIALIZER } from '@angular/core';
@NgModule({
//...
providers: [AuthService,
{
provide: APP_INITIALIZER,
useFactory: (authService: AuthService) => () => authService.loadValue(),
deps: [AuthService],
multi: true
}]
///....
})
Надеюсь, поможет!!
Зачем вам нужно усложнять вопрос
В вашем компоненте, где вам требуется значение, сделайте это
authState : boolean;
constructor(private afAuth: AngularFireAuth) {
this.afAuth.authState.subscribe((auth) => {
this.authState = ( auth !== null ) ? true : false;
});
}
Лучше было бы иметь отдельную функцию
authenticated(): Observable<User> {
return this.afAuth.authState;
}
тогда в вашем компоненте вы можете подписаться на этот метод, как вы это делали в конструкторе сервисов
Под редакцией!