Interação entre Componentes - Angular
Passando Dados para o Componente Filho
No tema anterior, vimos como chamar um componente a partir de um componente principal. No entanto, por padrão, esses componentes não interagem entre si; eles são independentes. Cada componente define suas próprias expressões de vinculação. Mas, o que acontece se quisermos vincular as propriedades do componente filho às propriedades do componente principal? Para isso, definimos o seguinte componente filho:
import { Input, Component } from "@angular/core";
@Component({
selector: 'child-comp',
standalone: true,
template: `<p>Nome do usuário: {{userName}}</p>
<p>Idade do usuário: {{userAge}}</p>`
})
export class ChildComponent {
@Input() userName: string = "";
@Input() userAge: number = 0;
}
O ponto crucial aqui é a definição das propriedades de entrada usando o decorador @Input()
import { Input } from "@angular/core";
A característica principal dessas propriedades de entrada é que elas podem ser definidas externamente, ou seja, podem receber valores de fora, como por exemplo, do componente principal.
Agora, vamos modificar o código do componente principal:
import { Component } from "@angular/core";
import { FormsModule } from '@angular/forms';
import { ChildComponent } from './child.component';
@Component({
selector: "my-app",
standalone: true,
imports: [ChildComponent, FormsModule],
template: `<child-comp [userName]="name" [userAge]="age"></child-comp>
<input type="text" [(ngModel)]="name" />`
})
export class AppComponent {
name = "Tom";
age = 24;
}
Como a propriedade userName no componente filho foi definida como uma propriedade de entrada com o decorador @Input
<child-comp [userName]="name" [userAge]="age"></child-comp>
O mesmo vale para a propriedade userAge
Também é importante notar que, para utilizar a vinculação no campo de entrada, precisamos importar o módulo FormsModule
Assim, as propriedades userAge
userName

Vinculação ao Setter
Além da vinculação a uma propriedade, também podemos configurar a vinculação a um setter no componente filho. Isso pode ser necessário quando o componente filho precisa realizar uma verificação ou até mesmo modificar o valor recebido do componente principal.
Por exemplo, no componente principal, definimos a idade do usuário:
<child-comp [userName]="name" [userAge]="age"></child-comp>
import { Component } from "@angular/core";
import { FormsModule } from '@angular/forms';
import { ChildComponent } from './child.component';
@Component({
selector: "my-app",
standalone: true,
imports: [ChildComponent, FormsModule],
template: `<child-comp [userName]="name" [userAge]="age"></child-comp>
<input type="number" [(ngModel)]="age" />`
})
export class AppComponent {
name = "Tom";
age = 24;
}
No componente filho, vamos receber a idade passada por meio de um setter:
import { Input, Component } from "@angular/core";
@Component({
selector: 'child-comp',
standalone: true,
template: `<p>Nome do usuário: {{userName}}</p>
<p>Idade do usuário: {{userAge}}</p>`
})
export class ChildComponent {
@Input() userName: string = "";
private _userAge: number = 0;
@Input()
set userAge(age: number) {
if (age < 0) {
this._userAge = 0;
} else if (age > 100) {
this._userAge = 100;
} else {
this._userAge = age;
}
}
get userAge() {
return this._userAge;
}
}
No componente principal, podemos inserir qualquer valor no campo de entrada, incluindo números negativos. No componente filho, o setter verifica o valor inserido e o ajusta se necessário.
