【问题标题】:What is the best practice to change a single object in Angular component in a reactive way [closed]以反应方式更改Angular组件中的单个对象的最佳实践是什么[关闭]
【发布时间】:2020-11-11 09:25:32
【问题描述】:

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

users$: Observable<User[]>;

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

我在模板中使用异步管道订阅了这个 observable:

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

我想通过另一个 http 请求更改单个用户的电子邮件,但保留单个订阅。问题是在我创建users$ observable 时尚未定义更改电子邮件的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);
  })
}

如您所见,我使用toPromise() 订阅了update_user。我不能提前合并这个请求,因为它在被请求之前没有定义。 我一直在互联网上搜索,但找不到公认​​的最佳做法。
你觉得应该怎么做? 谢谢

【问题讨论】:

  • 换个说法,您希望对用户的更新触发相同的users$ observable,以便您的组件在您更新用户时得到通知?
  • 我不确定。我想以响应式方法使用 HTTP 请求更改单个用户。我认为它可以通过异步管道仅使用一个订阅来完成,但我不确定这是否可能,所以我想听听关于应该如何完成的专业意见。

标签: angular rxjs async-pipe


【解决方案1】:

我建议将用户存储在主题中。初始调用以及任何更新都会在 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);
  })
}

【讨论】:

  • 谢谢!但是,使用 toPromise() 订阅 update_user 请求而不是以某种方式将其合并到 users$ observable 并为两个请求使用单个订阅,这不是一个坏习惯吗?
猜你喜欢
  • 2018-12-22
  • 2019-10-07
  • 2016-03-28
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多