Я хочу создать реактивный магазин для пользовательского объекта. Итак, позвольте мне сначала описать, что я пробовал. Я определил простой пользовательский класс:
export class User {
constructor(public $key: string) {}
}
Для простоты класс просто содержит ключ. Я использую хранилище Firebase, и для запроса этого хранилища я создал класс обслуживания:
export class UserService {
constructor(private af: AngularFire, private authService: AuthService) {}
getUser() {
return this.authService.authInfo$.concatMap(a => this.af.database.object('/users/' + a.uid));
}
}
getUser()
сначала извлекает идентификатор пользователя и запрашивает базу данных Firebase для конкретного пользователя. Однако я не хочу использовать сервис напрямую. Скорее я хотел бы иметь глобальное хранилище с BehaviorSubject, которое содержит последний пользовательский объект. Итак, давайте представим магазин:
export class UserStore {
private _user: BehaviorSubject<User> = new BehaviorSubject(null);
constructor(private userService: UserService) {
this.userService.getUser().subscribe(
userJson => {
this._user.next(new User(userJson.$key, userJson.firstName, userJson.lastName, null, userJson.personalDataSheet));
},
err => console.error
);
}
get user() {
return this._user.asObservable();
}
}
Теперь я использую этот магазин в таком компоненте:
this.userStore.user.subscribe(
user => console.log(user)
);
И это работает! Пользователь зарегистрирован. Однако, когда я делаю что-то вроде
user: User;
...
this.userStore.user.subscribe(
user => this.user = user
);
подписка будет вызвана только один раз, когда пользователь будет нулевым. Почему это? this.user = user
создает еще какую-то подписку и отменяет первую?
Observable.interval
. - person Madhu Ranjan   schedule 23.02.2017