以反应方式更改Angular组件中单个对象的最佳实践是什么

问题描述

假设我有一个获取用户的http请求:

users$: Observable<User[]>;

ngOnInit() {
  users$ = this.users_service.get_all_users();
}

我在模板中使用异步管道订阅了此可观察的内容:

<div *ngFor="let user of users$ | async">

我想更改具有另一个http请求的单个用户的电子邮件,但保留单个订阅。问题是在我创建的users$可观察点尚未定义更改电子邮件的http请求。 我所做的是:

users$: Observable<User[]>;
update_user_event$ = new BehaviorSubject(null);
users_with_updates$: Observable<User[]>;

ngOnInit() {
  users$ = this.users_service.get_all_users();

  users_with_updates$ = Observable.combineLatest(users$,update_user_event$)
  .switchMap(([users,update_user_event]) => {
    return Observable.of(users)
  })
}
update_user(user) {
  this.user_service.update_user(user)
  .toPromise() // <== I don't want to subscribe to this request. Is there a way to combine it with `users$` without subscribing?
  .then(updated_user => {
    for(let key of user) {
      user[key] = updated_user[key]
    }
    update_user_event$.next(null);
  })
}

如您所见,我使用update_user订阅了toPromise()。由于无法定义该请求,因此无法提前合并。 我一直在互联网上搜索,但找不到商定的最佳实践。
您认为应该怎么做? 谢谢

解决方法

我建议将用户存储在一个主题中。初始调用以及所有更新都将在BehaviorSubject上调用next

private users: BehaviorSubject<User[]> = new BehaviorSubject<User[]>([]);
users$: Observable<User[]> = this.users.asObservable();

ngOnInit() {
  this.users_service.get_all_users().subscribe(this.users);
}

update_user(user) {
  this.user_service.update_user(user)
  .toPromise()
  .then(user => {
    const currentUsers = this.users.value;
    // TODO: change user in currentUsers
    this.users.next(currentUsers);
  })
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...