Understanding @Input, @Output and EventEmitter in Angular

Dla tych, którzy są nowi w Angularze, dekoratory Input i Output są trochę zagmatwane, szczególnie gdy uczysz się ich patrząc na przykładowy kod. W tym artykule postaram się wyjaśnić je w najprostszy sposób.

Narzędzie do wymiany danych

Po pierwsze, ideą Input i Output jest wymiana danych pomiędzy komponentami. Są one mechanizmem do wysyłania/odbierania danych z jednego komponentu do drugiego.

Input jest używany do odbierania danych w, podczas gdy Output jest używany do wysyłania danych na zewnątrz. Wyjście wysyła dane poprzez eksponowanie producentów zdarzeń, zwykle obiektów EventEmitter.

Więc kiedy widzisz kod taki jak ten

@Component({
selector: 'todo-item',
...
})export class TodoItemComponent {
@Input() item
@Output() onChange = new EventEmitter()
}

to znaczy

  • hej, oczekuję, że dane zostaną wysłane do mnie. Odbiorę je i przechowam w mojej właściwości item
  • przy okazji, będę produkował i wysyłał dane poprzez właściwość onChange.

Powiedzmy, że masz komponent TodoList, który zawiera komponent TodoItem. W szablonie TodoList spodziewamy się zobaczyć

...
<todo-item
="myTask"
(onChange)="handleChange($event)"
</todo-item>
...

co oznacza

  • TodoList umieszcza wartości danych w swojej właściwości myTask i przekazuje je do TodoItem
  • dane emitowane z TodoItem zostaną odebrane i obsłużone przez funkcję handleChange() w TodoList

To tyle jeśli chodzi o teorię. Spójrzmy na przykład.

@Input i @Output w akcji

Sprawdź ten przykład. Stworzyłem tutaj 2 komponenty, komponent hello zagnieżdżony wewnątrz komponentu app. Komponent hello ma wejście i wyjście

hello.component.ts
@Component({
selector: 'hello',
template: `
<h3 (click)="onClick.emit('Neo')">
...
</h3>
`
})export class HelloComponent {
@Input() myFriend: string
@Output() onClick = new EventEmitter()
}

Oczekuje, że otrzyma wartość łańcuchową i przechowuje ją we właściwości myFriend.

@Input() myFriend: string

Za każdym razem, gdy na niego klikniesz, właściwość wyjściowa onClick wyemituje ciąg 'Neo’ do świata zewnętrznego.

<h3 (click)="onClick.emit('Neo')">

Poniżej znajduje się komponent aplikacji

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>

Zauważ, że komponent aplikacji używa znacznika hello w swoim szablonie i robi dwie rzeczy:

  • przekazanie wartości łańcuchowej 'Angular’ do hello poprzez jego właściwość ng
<hello myFriend="{{ ng }}"
  • odebranie emitowanej wartości z hello i przetworzenie tej wartości przez funkcję upCase()
<hello myFriend="{{ ng }}" (onClick)="upCase($event)">

Możesz zobaczyć aplikację w akcji tutaj

.