/* eslint-disable @angular-eslint/directive-selector */ import { NgFor, NgForOf } from '@angular/common'; import { Directive, Input, NgIterable, NgModule, Provider, inject, } from '@angular/core'; @Directive({ selector: '[ngForTrackByProp]', standalone: true, }) export class NgForTrackByPropDirective { @Input() ngForOf!: NgIterable; @Input() set ngForTrackByProp(ngForTrackBy: keyof T) { // setter this.ngFor.ngForTrackBy = (index: number, item: T) => item[ngForTrackBy]; } private ngFor = inject(NgForOf, { self: true }); } @Directive({ selector: '[ngForTrackById]', standalone: true, }) export class NgForTrackByIdDirective { @Input() ngForOf!: NgIterable; // 2 private ngFor = inject(NgForOf, { self: true }); // 3 constructor() { this.ngFor.ngForTrackBy = (index: number, item: T) => item.id; // 4 } } export const NgForTrackByDirective: Provider[] = [ NgForTrackByIdDirective, NgForTrackByPropDirective, ]; @NgModule({ imports: [NgFor, NgForTrackByDirective], exports: [NgFor, NgForTrackByDirective], }) export class NgForTrackByModule {}