Pochopení @Input, @Output a EventEmitter v Angularu
Pro ty, kteří s Angularem teprve začínají, jsou dekorátory Input a Output poněkud matoucí, zejména pokud je studujete při pohledu na ukázkový kód. V tomto článku se je pokusím co nejjednodušeji vysvětlit.
Nástroj pro výměnu dat
Především je myšlenkou dekorátorů Input a Output výměna dat mezi komponentami. Jsou mechanismem pro odesílání/přijímání dat z jedné komponenty do druhé.
Input slouží k přijímání dat dovnitř, zatímco Output slouží k odesílání dat ven. Output posílá data ven vystavením producentů událostí, obvykle objektů EventEmitter.
Takže když vidíte kód jako tento
@Component({
selector: 'todo-item',
...
})export class TodoItemComponent {
@Input() item
@Output() onChange = new EventEmitter()
}
tak to znamená
- hele, očekávám, že mi budou poslána data. Přijmu je a uložím do své vlastnosti item
- mimochodem, data vytvořím a odešlu prostřednictvím vlastnosti onChange.
Řekněme, že máte komponentu TodoList, která obsahuje komponentu TodoItem. V šabloně TodoList byste měli vidět
...
<todo-item
="myTask"
(onChange)="handleChange($event)"
</todo-item>
...
což znamená, že
- TodoList vloží hodnoty dat do své vlastnosti myTask a předá je TodoItem
- data vyslaná z TodoItem budou přijata a zpracována funkcí handleChange() v TodoList
Tolik k teorii. Pojďme se podívat na příklad.
@Input a @Output v akci
Podívejte se na tento příklad. Zde jsem vytvořil 2 komponenty, komponentu hello vnořenou uvnitř komponenty app. Komponenta hello má Input a Output
hello.component.ts
@Component({
selector: 'hello',
template: `
<h3 (click)="onClick.emit('Neo')">
...
</h3>
`
})export class HelloComponent {
@Input() myFriend: string
@Output() onClick = new EventEmitter()
}
Očekává, že obdrží řetězcovou hodnotu a uloží ji do vlastnosti myFriend.
@Input() myFriend: string
Při každém kliknutí na ni bude vlastnost Output onClick vysílat do vnějšího světa řetězec ‚Neo‘.
<h3 (click)="onClick.emit('Neo')">
Níže je komponenta aplikace
app.component.ts
export class AppComponent {
ng = 'Angular'
myName = 'Neo' upCase(st:string): void { ... }
}app.component.html
<hello myFriend="{{ ng }}" (onClick)="upCase($event)"></hello>
<h3>My name is {{ myName }}</h3>
Všimněte si, že komponenta aplikace používá ve své šabloně značku hello a provádí dvě věci:
- předává řetězcovou hodnotu ‚Angular‘ do hello prostřednictvím své vlastnosti ng
<hello myFriend="{{ ng }}"
- přijímá emitovanou hodnotu z hello a zpracovává tuto hodnotu pomocí funkce upCase()
<hello myFriend="{{ ng }}" (onClick)="upCase($event)">
Aplikaci můžete vidět v akci zde