【发布时间】:2026-01-28 19:25:01
【问题描述】:
我想为用户对象创建一个反应式存储。所以让我先描述一下我尝试过的东西。我定义了一个简单的用户类:
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() 首先获取用户 ID 并查询特定用户的 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
);
subscribe 只会在用户为 null 的情况下被调用一次。这是为什么? this.user = user 是否会创建某种其他订阅并取消第一个订阅?
【问题讨论】:
-
是什么让你说用户没有再次更新?您是否尝试过记录并分配两者?
-
@MadhuRanjan 对,因为我登录用户并且它只记录一次(空)
-
你能创建一个 Plunker 来处理你的问题吗?我试过了,但没有遇到任何问题,请查看Plunker,例如,我刚刚使用了
Observable.interval。
标签: angular rxjs angular2-observables