Vinculando com Eventos de um Componente Filho - Angular
Outra forma de interação é o vínculo com eventos de um componente filho. Vamos definir o seguinte componente filho:
import { Component, EventEmitter, Output } from "@angular/core";
@Component({
selector: 'child-comp',
standalone: true,
template: `<button (click)="change(true)">+</button>
<button (click)="change(false)">-</button>`
})
export class ChildComponent {
@Output() onChanged = new EventEmitter<boolean>();
change(increased: boolean) {
this.onChanged.emit(increased);
}
}
Neste componente, o evento click
change
true
false
EventEmitter
onChanged
true
false
boolean
onChanged
@Output
Na prática, a propriedade onChanged
change()
Agora, definimos o código do componente pai:
import { Component } from "@angular/core";
import { ChildComponent } from './child.component';
@Component({
selector: "my-app",
standalone: true,
imports: [ChildComponent],
template: `<h2>Quantidade de cliques: {{clicks}}</h2>
<child-comp (onChanged)="onChanged($event)"></child-comp>`
})
export class AppComponent {
clicks = 0;
onChanged(increased: boolean) {
increased ? this.clicks++ : this.clicks--;
}
}
Usando a expressão (onChanged)="onChanged($event)"
onChanged
onChanged()
$event
Assim, ao clicar nos botões do componente filho, o evento é transmitido ao componente pai, que aumenta ou diminui o contador conforme o valor recebido.

Vínculo Bidirecional
No exemplo anterior, vinculamos um evento do componente filho: quando o evento ocorre no componente filho, ele é tratado no componente pai por meio de um método. No entanto, também podemos usar o vínculo bidirecional entre as propriedades do componente pai e do componente filho. Por exemplo, considere o componente filho a seguir:
import { Component, Input, Output, EventEmitter } from "@angular/core";
import { FormsModule } from '@angular/forms';
@Component({
selector: 'child-comp',
standalone: true,
imports: [FormsModule],
template: `<input [ngModel]="userName" (ngModelChange)="onNameChange($event)" />`
})
export class ChildComponent {
@Input() userName: string = "";
@Output() userNameChange = new EventEmitter<string>();
onNameChange(model: string) {
this.userName = model;
this.userNameChange.emit(model);
}
}
Aqui, definimos a propriedade de entrada userName
input
[ngModel]
userName
Para monitorar as mudanças no modelo deste campo, vinculamos o método onNameChange
ngModelChange
ngModelChange
Como o vínculo é unidirecional, o método de tratamento recebe o valor inserido, altera a propriedade userName
userNameChange
Assim, recebemos externamente um valor para a propriedade userName
userNameChange
Agora, definimos o código do componente pai:
import { Component } from "@angular/core";
import { ChildComponent } from './child.component';
@Component({
selector: "my-app",
standalone: true,
imports: [ChildComponent],
template: `<child-comp [(userName)]="name"></child-comp>
<div>Nome selecionado: {{name}}</div>`
})
export class AppComponent {
name = "Tom";
}
Aqui, estabelecemos o vínculo bidirecional entre a propriedade userName
filho
name
userNameChange
