После того, как я потратил несколько дней на одну и ту же задачу, вот несколько советов, которые я могу дать: Я использую событие ввода, чтобы следить за вводом пользователя:
<input matInput class="form-control"
(input)="filterChanged($event.target.value)"
placeholder="Search Skill">
К этому фильтру я прикрепил тему, поэтому яможно подписаться на него:
searchFilter: Subject<string> = new Subject<string>();
filterChanged(filter: string): void {
this.searchFilter.next(filter);
}
Чтобы сделать его более плавным для пользователя, обычно мы хотим отложить выполнение поиска, которое вы можете сделать с помощью debounceTime
.
this.searchFilter.pipe(debounceTime(500), distinctUntilChanged())
.subscribe(value => {
if (value && value.length >= 3) {
this.filterByName(value);
} else {
this.clearFilter();
}
});
.выполнить поиск, я скрываю и показываю узлы, используя класс css.Это делается непосредственно в коллекции презентаций, которая является плоской и очень легко фильтруется.
treeControl: FlatTreeControl<SkillFlatNode>;
this.treeControl.dataNodes
Сначала я скрываю все, а затем показываю только те, которые соответствуют критериям.Наконец, я хочу показать своим родителям, но это характерно для моей древовидной структуры.
private filterByName(term: string): void {
const filteredItems = this.treeControl.dataNodes.filter(
x => x.value.DisplayName.toLowerCase().indexOf(term.toLowerCase()) === -1
);
filteredItems.map(x => {
x.visible = false;
});
const visibleItems = this.treeControl.dataNodes.filter(
x => x.value.IsSkill &&
x.value.DisplayName.toLowerCase().indexOf(term.toLowerCase()) > -1
);
visibleItems.map( x => {
x.visible = true;
this.markParent(x);
});
}
Наконец, вот прозрачный фильтр:
private clearFilter(): void {
this.treeControl.dataNodes.forEach(x => x.visible = true);
}
Не повторяйте ту же ошибку, что я сделал, и попытайтесь отфильтровать коллекцию ввода (this.dataSource.data
в моем случае) потому что вы потеряете свой выбор или вам придется сопоставить его с презентацией.Вот мои исходные данные:
this.treeFlattener = new MatTreeFlattener(
this.transformer, this._getLevel, this._isExpandable, this._getChildren
);
this.treeControl = new FlatTreeControl<SkillFlatNode>(
this._getLevel, this._isExpandable
);
this.dataSource = new MatTreeFlatDataSource(
this.treeControl, this.treeFlattener
);
skillService.dataChange.subscribe(data => {
this.dataSource.data = data;
});