如何使用 angular 通过选择框过滤 table

How to filter a table via a selectbox using angular

给定自定义 table 组件以及自定义 select 框组件,我希望能够通过 selecting 选项过滤 table 行来自 select 框。

我的想法是先在我的select框的选项中添加一个点击监听器,这样当点击一个选项时,onOptionClicked()方法就会被执行。在这个 onOptionClicked() 方法中,我将发出一个 optionSelected 事件:

  @Output() optionSelected = new EventEmitter<string>();

  onOptionClicked(option: string) {
    this.optionSelected.emit(option);
  }

我的 table 组件将对事件做出反应 optionSelected:

<div class="tbl" (optionSelected)="filterTableRows($event)">
  <table>
    <thead>
...

这个想法似乎有一些根本性的错误,但是:

  1. 我的 IDE 显示错误 Event optionSelected is not emitted by any applicable directives nor by div element

  2. table 对 optionSelected 事件没有反应。

看来问题是我的 table 组件和我的 select-box 组件是不同的组件,显然它们无法通过事件发射器进行通信。有人可以帮帮我吗?

我认为@Output()decorator的用法存在误区。这是用来向使用此组件的其他组件发出信号的东西。您似乎在同一个组件中使用它。

而是使用 ReplaySubject 来保留您的过滤器:

optionSelected$ = new ReplaySubject<string>('');

onOptionClicked(option: string) {
  this.optionSelected$.next(option);
}

要进行数据过滤,您可以订阅重播主题:

this.optionSelected$.subscribe(filter => {
  this.yourFilteredData = this.yourData.filter(item => { 
   // <-- you filter code
  });
})

注意:请记得在组件销毁时完成任何订阅,以免出现常见的memory leak.