Directives & Pipes
Priority: P2 (MEDIUM)
Principles
- Composition: Use hostDirectives: [TooltipDirective] on
@Componentor@Directivedecorators to compose behaviors without inheritance. Expose inputs/outputs via hostDirectives: [{ directive: TooltipDirective, inputs: ['text'] }]. - Pure Pipes: Decorate with
@Pipe({ name: 'truncate', standalone: true, pure: true }). Implement PipeTransform withtransform(value: string, limit = 50)method. Pipes must be pure: true (default) to cache results by input reference — Angular only re-runs them when the reference changes. Do not set pure: false unless handling Observables/Arrays that mutate. - Directive Logic: Encapsulate reusable DOM manipulation or behavioral logic in standalone: true Directives (e.g., selector: '[appHighlight]'). Inject ElementRef/Renderer2 for DOM access.
Guidelines
- Signal Inputs: Directives and Pipes support signal inputs.
- Standalone: All Pipes and Directives must be standalone. Do not declare in NgModule; import directly in component imports array. Use ng generate directive to scaffold.
Anti-Patterns
- No @HostBinding/@HostListener: Use the host: {} object in the
@Directivedecorator — not with @HostBinding or @HostListener (e.g., '(mouseenter)': 'show()', '[attr.aria-label]': 'text()') — these decorators are deprecated patterns. - No impure pipes for static transforms: Keep
pure: true(default); useasyncpipe for Observables. - No structural directives for conditionals: Use native
@if/@for/@switchblock syntax.