A @Input, @Output és EventEmitter megértése Angularban

Azoknak, akik még újak Angularban, az Input és Output dekorátorok kissé zavarosak, különösen, ha példakódok alapján tanulmányozzuk őket. Ebben a cikkben megpróbálom a legegyszerűbben elmagyarázni őket.

Egy eszköz az adatcseréhez

Először is, az Input és Output lényege, hogy adatokat cseréljünk a komponensek között. Ezek egy olyan mechanizmus, amellyel adatokat küldhetünk/fogadhatunk egyik komponensből a másikba.

A bemenet az adatok beérkezésére szolgál, míg a kimenet az adatok kiküldésére. Az Output adatokat küld ki az eseménytermelők, általában EventEmitter objektumok exponálásával.

Így amikor ilyen kódot látsz

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

az azt jelenti

  • hé, azt várom, hogy adatokat küldjenek nekem. Fogadom és tárolom az item tulajdonságomban
  • mellesleg az onChange tulajdonságon keresztül fogom előállítani és kiküldeni az adatokat.

Tegyük fel, hogy van egy TodoList komponensed, amely TodoItem komponenst tartalmaz. A TodoList sablonban várhatóan

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

ez azt jelenti, hogy

  • A TodoList adatértékeket tesz a myTask tulajdonságába és átadja a TodoItem
  • A TodoItem által kibocsátott adatokat a TodoList

handleChange() függvénye fogadja és kezeli

Ez az elmélet ennyi. Nézzük meg a példát.

@Input és @Output működésben

Nézzük meg ezt a példát. Itt 2 komponenst hoztam létre, a hello komponenst az app komponensbe ágyazva. A hello komponensnek van egy Input és egy Output

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

Egy string értéket vár, és azt a myFriend tulajdonságban tárolja.

@Input() myFriend: string

Minden alkalommal, amikor rákattintunk, az Output tulajdonság onClick egy ‘Neo’ stringet bocsát ki a külvilág felé.

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

Az alábbiakban az alkalmazáskomponens

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>

Megjegyezzük, hogy az alkalmazáskomponens a hello taget használja a sablonjában, és két dolgot csinál:

  • egy ‘Angular’ string értéket ad át a hello számára az ng tulajdonságon keresztül
<hello myFriend="{{ ng }}"
  • megkapja a hello által kibocsátott értéket, és azt az upCase() függvénnyel feldolgozza
<hello myFriend="{{ ng }}" (onClick)="upCase($event)">

Az alkalmazás itt látható működés közben

.