C'est quoi @Input ?
@Input()
sert Ă passer une donnĂ©e dâun composant parent vers son composant enfant.
Imaginons que nous avons un composant qui affiche une liste de produits sur notre site ecommerce :
@Component({
selector: "app-products-list",
standalone: true,
imports: [NgFor],
template: `
<ul>
<li *ngFor="let product of products">
{{ product.name }} costs {{ product.price }}
</li>
</ul>
`,
})
export class ProductsListComponent {
@Input() products: Product[];
}
Ce composant affiche une liste de produits, et on veut pouvoir lâutiliser plusieurs fois dans notre application en y passant une liste de produits diffĂ©rents Ă chaque fois. Pour ce faire, on dĂ©clare une propriĂ©tĂ© prĂ©cĂ©dĂ©e de @Input()
.
Le nom de la propriété sera le nom à utiliser dans le consommateur du composant.
Et voilĂ Ă lâutilisation :
@Component({
selector: "app-root",
standalone: true,
imports: [ProductsListComponent],
template: `
<app-products-list [products]="shirts" />
<app-products-list [products]="pants" />
`,
})
export class AppComponent {
shirts = [
{ id: 0, name: "shirt1", price: 20 },
{ id: 1, name: "shirt2", price: 10 },
{ id: 2, name: "shirt3", price: 15 },
];
pants = [
{ id: 0, name: "pant1", price: 20 },
{ id: 1, name: "pant2", price: 10 },
{ id: 2, name: "pant3", price: 15 },
];
}
Ici, on a un composant qui utilise deux fois le composant ProductsListComponent
dans le template en y passant une liste diffĂ©rente Ă chaque fois grĂące Ă lâattribut [products]
qui correspond au nom quâon a utilisĂ© dans le composant !
Alias
On peut aussi donner un nom différent à la propriété entre son consommateur et le composant qui porte le @Input()
, câest ce quâon appelle un alias.:
@Component({
selector: "app-products-list",
standalone: true,
imports: [NgFor],
template: `
<ul>
<li *ngFor="let item of items">{{ item.name }} costs {{ item.price }}</li>
</ul>
`,
})
export class ProductsListComponent {
@Input({ alias: "products" }) items: Product[];
}
Required
Nous pouvons rendre obligatoire nos @Input()
grùce à la propriété required
.
@Input({required: true}) products: Product[];
En passant {required: true}
Ă votre @Input(), celui-ci devient requis lors de lâutilisation du composant, si vous ne le mettez pas alors vous aurez une erreur de compilation !
Transform
La propriété transform
permet de transformer la valeur de lâ@Input()
avant quâelle soit assignĂ©e Ă la propriĂ©tĂ© du composant.
@Input({transform: (value: string) => value.toUpperCase()}) name: string;
Il existe plusieurs fonctions quâAngular a mis Ă disposition pour transformer les valeurs des @Input()
:
{transform: booleanAttribute}
: transforme la valeur en boolean{transform: numberAttribute}
: transforme la valeur en nombre
Route Input
@Input()
permet aussi de récupérer les paramÚtres de la route dans le composant.
Pour que cela fonctionne, il faut activer cette fonctionnalité dans appConfig
:
export const appConfig: ApplicationConfig = {
providers: [provideRouter(appRoutes, withComponentInputBinding())],
};
Vous pouvez ensuite récupérer les données de la route dans votre composant :
{
path: 'products/:id',
loadComponent: () => import('./routes/products/products.route'),
data: {
showCart: true,
},
},
@Component({
template: `
{{ id }}
{{ foo }}
{{ showCart }}
`,
})
export class ProductsComponent {
@Input() id: string; // ça vient de /:id
@Input() foo: string; // ça vient de ?foo=bar
@Input() showCart: boolean; // ça vient de data: { showCart: true }
}