Filter using Custom directives in Angular
Filtering lists is something we all end up doing in apps. Sure, you can throw in a pipe or hack something together, but I wanted a reusable…
Wiki topics:
🌐 · Web Development
Filter using Custom directives in Angular
Filtering lists is something we all end up doing in apps. Sure, you can throw in a pipe or hack something together, but I wanted a reusable way that feels clean. So I wrote a simple directive.

Filter in Angular using custom directive
Directive
import { Directive, Input, EventEmitter, Output } from '@angular/core';
@Directive({
selector: '[appFilter]',
})
export class FilterDirective<T> {
@Input('appFilter') items: T[] = [];
@Input() filterKey?: string;
@Output() filtered = new EventEmitter<T[]>();
private query: string = '';
ngOnChanges() {
this.query = this.filterKey?.toLowerCase() || '';
this.applyFilter();
}
private applyFilter() {
console.log('Filtering with query:', this.query);
if (!this.items) return;
if (this.query.trim() === '') {
this.filtered.emit(this.items);
return;
}
const result = this.items.filter((item: any) => {
return item.toLowerCase().includes(this.query);
});
const noDataFound = ['No Data Found'];
if (result.length === 0) this.filtered.emit(noDataFound as any);
else this.filtered.emit(result);
}
}
Template
<input type="text" [appFilter]="items" (filtered)="afterFilter($event)" [filterKey]="searchText"
[(ngModel)]="searchText" placeholder="Search by name" />
<p> {{items | json}}</p>
<ul>
<li *ngFor="let item of filteredItems">
{{item}}
</li>
</ul>
Component
import { Component, computed, signal } from '@angular/core';
import { RouterOutlet } from '@angular/router';
import { FilterDirective } from './filter';
import { FormsModule } from '@angular/forms';
@Component({
selector: 'app-root',
imports: [RouterOutlet, FilterDirective, FormsModule],
templateUrl: './app.html',
styleUrl: './app.css',
// changeDetection: ChangeDetectionStrategy.OnPush,
})
export class App {
items: any[] = [
'Omega',
'Alpha',
'Beta',
'Gamma',
'Om',
'BetaMax',
'Delta',
'Epsilon',
'Zeta',
'Eta',
'Theta',
];
filteredItems: any[] = this.items;
searchText: string = '';
afterFilter(filteredItems: any[]) {
console.log('Filtered items received in App component:', filteredItems);
this.filteredItems = filteredItems;
// this.items = filteredItems;
}
}
How it works
- Directive Input: The directive takes the list (
items) and the search text (filterKey). - Filtering Logic: On every change, it filters the list by checking if the item includes the search query.
- Event Emission: The filtered list is emitted back to the parent component.
- Fallback: If no matches are found,
"No Data Found"is displayed.
메타데이터
- post_id
- fbfbf0a6d680
- slug
- filter-using-custom-directives-in-angular-fbfbf0a6d680
- url
- https://medium.com/@msgtoom/filter-using-custom-directives-in-angular-fbfbf0a6d680
- canonical_url
- https://medium.com/@msgtoom/filter-using-custom-directives-in-angular-fbfbf0a6d680
- author_url
- https://medium.com/@msgtoom
- status
- ok
- fetched_at
- 2026-06-24 18:57:25