在ngOnInit
中,我的组件会获得如下所示的用户列表:
this.userService.getUsers().subscribe(users => {
this.users = users;
});
userService.getUsers()的实现如下所示:
getUsers() : Observable<UserModel[]> {
return this.http.get('http://localhost:3000/api/user')
.map((res: Response) => <UserModel[]>res.json().result)
.catch((error: any) => Observable.throw(error.json().error || 'Internal error occurred'));
}
现在,在另一个组件中,我有一个可以创建新用户的表单。问题是,当我使用第二个组件来创建用户时,第一个组件不知道它应该向后端发出新的GET请求以刷新其用户视图。我怎么能告诉它呢?
我知道理想情况下我想跳过额外的HTTP GET请求,只需在客户端发出POST时插入数据时附加客户端已有的数据,但我想知道它是怎么回事。如果出于某种原因无法做到这一点,那就完成了。
答案 0 :(得分:16)
为了使一个observable能够在初始Http observable完成后提供值,它可以由RxJS主题提供。由于需要缓存行为,app = App.get_running_app()
w = app.notecode.ids.image.reload()
符合这种情况。
应该是
ReplaySubject
由于主题已存在,因此可以在不更新服务器列表的情况下推送新用户:
class UserService {
private usersSubject: Subject;
private usersRequest: Observable;
private usersSubscription: Subscription;
constructor(private http: Http) {
this.usersSubject = new ReplaySubject(1);
}
getUsers(refresh: boolean = false) {
if (refresh || !this.usersRequest) {
this.usersRequest = this.http.get(...).map(res => res.json().result);
this.usersRequest.subscribe(
result => this.usersSubject.next(result),
err => this.usersSubject.error(err)
);
}
return this.usersSubject.asObservable();
}
onDestroy() {
this.usersSubscription.unsubscribe();
}
}
答案 1 :(得分:3)
到目前为止我处理这个问题的方法是使用中介。 this.userService.getUsers()返回一个Rx.BehviorSubject,它在http observable的返回时被初始化。
接近这一点:
getUsers() : BehaviorSubject<UserModel[]> {
return this.behaviorSubject;
}
updateUsers() {
this.http.get('http://localhost:3000/api/user')
.map((res: Response) => <UserModel[]>res.json().result)
.catch((error: any) => Observable.throw(error.json().error || 'Internal error occurred'))
.subscribe((value) => {
this.behaviorSubject.onNext(value)});
}