【问题标题】:How to avoid overwriting event when productId is different?当productId不同时如何避免覆盖事件?
【发布时间】:2016-06-13 04:57:04
【问题描述】:

我有一份产品清单。每个产品都有一个iddescription

<div *ngFor="let product of products">
  <input type="text" [ngModel]="product.description" (ngModelChange)="onEdit($event, product.id)">
</div>

editStream: EventEmitter<any> = new EventEmitter();

ngOnInit() {
  this.editStream
    .debounceTime(1000)
    .distinctUntilChanged()
    .mergeMap(x => Observable.of(x))
    .subscribe(x => {
      // based on product id, update its description in the database
    });

}

private onEdit(description: string, id: string) {
  this.editStream.emit({ description, id });
}

当我编辑一个产品的描述时效果很好。

但是,如果我编辑product1的描述,然后立即编辑product2的描述(时间间隔小于1s),只会更新product2的描述。

我猜这是因为product2的事件覆盖了product1的事件,而我只订阅了一个地方。

我该如何解决这个问题?谢谢

【问题讨论】:

    标签: typescript angular rxjs rxjs5


    【解决方案1】:

    如果您想使用distinctUntilChanged(),您需要为每个product 使用不同的Observable

    this.products.forEach(p => this.editStreams.push(new EventEmitter())
    
    <div *ngFor="let product of products let i=index">
      <input type="text" [ngModel]="product.description" (ngModelChange)="onEdit($event, i, product.id)">
    </div>
    
    private onEdit(description: string, id: string) {
      this.editStreams[i].emit({ description, id });
    }
    

    【讨论】:

    • 嗯,“每个产品都有不同的 Observable”是什么意思?
    • 知道了,有没有一种聪明的方法可以创建一定数量的editStream(基于产品编号)?使用 editStream 数组?
    • 我用一些代码 sn-ps 更新了我的答案。您还需要单独订阅editStreams 中的每个项目(您在ngOnInit() 中所做的事情)。我不知道更聪明的方法。这并不意味着没有一个;-)
    • 看起来不错。但是假设我有 500 种产品。您的方式需要创建 500 个。也许仅在需要时创建 editStream。大多数时候只有1或2。因为在1s中,你只能一起编辑2。你能给我一些提示吗?
    • 您可能希望在输入聚焦时只设置一个。 (focus)="setupObservable(i)",如果已经设置好了,请退订。
    猜你喜欢
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2015-05-15
    • 2013-06-02
    • 1970-01-01
    • 2020-05-18
    相关资源
    最近更新 更多