# Inputs Inputs allow data to flow from a parent component to a child component. Angular recommends using the signal-based `input` API for modern applications. ## Signal-based Inputs Declare inputs using the `input()` function. This returns an `InputSignal`. ```ts import {Component, input, computed} from '@angular/core'; @Component({ selector: 'app-user', template: `

User: {{ name() }} ({{ age() }})

`, }) export class User { // Optional input with default value name = input('Guest'); // Required input age = input.required(); // Inputs are reactive signals label = computed(() => `Name: ${this.name()}`); } ``` ### Usage in Template ```html ``` ## Configuration Options The `input` function accepts a config object: - **Alias**: Change the property name used in templates. - **Transform**: Modify the value before it reaches the component. ```ts import { input, booleanAttribute } from '@angular/core'; @Component({...}) export class CustomButton { // Alias example label = input('', { alias: 'btnLabel' }); // Transform example using built-in helper disabled = input(false, { transform: booleanAttribute }); } ``` ## Model Inputs (Two-Way Binding) Use `model()` to create an input that supports two-way data binding. ```ts @Component({ selector: 'custom-counter', template: ``, }) export class CustomCounter { value = model(0); increment() { this.value.update((v) => v + 1); } } ``` ### Usage ```html ``` ## Decorator-based Inputs (@Input) The legacy API remains supported but is not recommended for new code. ```ts import { Component, Input } from '@angular/core'; @Component({...}) export class Legacy { @Input({ required: true }) value = 0; @Input({ transform: trimString }) label = ''; } ``` ## Best Practices - **Prefer Signals**: Use `input()` instead of `@Input()` for better reactivity and type safety. - **Required Inputs**: Use `input.required()` for mandatory data to get build-time errors. - **Pure Transforms**: Ensure input transform functions are pure and statically analyzable. - **Avoid Collisions**: Do not use input names that collide with standard DOM properties (e.g., `id`, `title`).