修改Angular2中的Observable导致BehaviorSubject触发

时间:2016-12-08 15:45:02

标签: angular observable rxjs5 behaviorsubject

在单击Select Market时,在下面的插件中,将使用一组数据填充Observable。第一个项目以黄色突出显示,因为它具有设置为选中的属性。当焦点在输入框上时,您可以在列表中向下箭头。问题是BehaviorSubject每次触发并从服务器获取数据列表。如何在没有searchTerms BehaviorSubject每次触发的情况下修改所选属性? market-search.component.ts文件中的searchInputArrowKeyPressed方法是处理箭头键的位置。

public searchInputArrowKeyPressed(event): void {
    this.markets = this.markets
        .map((markets: Market[]) => {
            for(let market of markets) {
                if(market.selected) {
                    if(event === 'down' && markets.indexOf(market) < markets.length) {
                        markets[markets.indexOf(market) + 1].selected = true;
                    }
                    if(event === 'up' && markets.indexOf(market) > 0) {
                        markets[markets.indexOf(market) - 1].selected = true;
                    }
                    market.selected = false;
                    return markets;
                }
            }
        });
}

https://plnkr.co/edit/TBYb5QBau9Vmz8PqQpCl?p=preview

提前感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:2)

我同意@ n00dl3,重新分配流看起来不自然。我修改了你的plunker,以便每个事件(数据,搜索,上/下和输入)都有自己的流。 E.g:

public searchInputArrowKeyPressed(event): void {
    this.upDownEvents.next(event);
}

通过在数据流中推送更新的数组来完成对数据的修改。

    this.upDownEvents
      .withLatestFrom(this.markets)
      .subscribe(([event, markets]) => {
          for(let market of markets) {
              if(market.selected) {
                  // change selected

                  this.markets.next(markets);
                  return;
              }
          }
      });

请查看here