#7: šŸ“¤ VinculaĆ§Ć£o de eventos

Queremos que nossa aplicaĆ§Ć£o reaja Ć s aƧƵes do usuĆ”rio. Queremos atualizar o tĆ­tulo do item de nossa lista toda vez que o usuĆ”rio trocar o nome, ou adicionar um novo item quando o usuĆ”rio aperta o botĆ£o de Salvar ou a tecla Enter.

NĆ³s ainda nĆ£o temos uma lista inteira para mostrar, mas no momento iremos usar outra maneira de testar a aĆ§Ć£o. NĆ³s iremos mudar para a funcionalidade correta mais tarde.

O componente input-button-unit deve se parecer com:

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-input-button-unit',
  template: `
    <p>
      input-button-unit works!
      The title is: {{ title }}
    </p>

    <input [value]="title">
    <button>Save</button>
  `,
  styleUrls: ['./input-button-unit.component.css']
})
export class InputButtonUnitComponent implements OnInit {
  title = 'Hello World';

  constructor() { }

  ngOnInit() {
  }
}

AĆ§Ć£o

Primeiro, vamos implementar a funĆ§Ć£o changeTitle. Ela receberĆ” o novo tĆ­tulo como argumento. SĆ£o melhores prĆ”ticas ter nossos metodos customizados escritos apĆ³s metodos de ciclo de vida (ngOnInit neste caso).

changeTitle(newTitle: string) {
  this.title = newTitle;
}

Ligando os Eventos

Assim como ligar propriedades de um elemento, nĆ³s podemos ligar eventos que sĆ£o emitidos por outros elementos. Novamente, o Angular nos dĆ” uma maneira bem simples de fazer isso. VocĆŖ sĆ³ coloca o nome do evento entre parĆŖntesis e passa o evento no mĆ©todo que deve ser executado quando o evento for emitido.

Vamos tentar com um exemplo simples, onde o tĆ­tulo estĆ” mudando quando o usuĆ”rio clica no botĆ£o. Note que existe um parĆŖntesis em volta do click. (NĆ³s tambĆ©m trocamos a ligaĆ§Ć£o do input de volta para o valor title.)

template: `
  <p>
    input-button-unit works!
    The title is: {{ title }}
  </p>

  <input [value]="title">
  <button (click)="changeTitle('Button Clicked!')">
    Save
  </button>
`,

O evento tem nome de click e nĆ£o onClick - em Angular vocĆŖ remove o prefixo on dos eventos nos elementos.

VĆ” para o navegador e veja o resultado - clique no botĆ£o Save.

Dados do Evento

Passamos uma string estƔtica no mƩtodo chamada de: Button Clicked!. Mas queremos passar o valor que o usuƔrio digitou na caixa de input!

No prĆ³ximo capĆ­tulo iremos aprender como usar as propriedades de um elemento em outro elemento no mesmo template. Depois, seremos capazes de completar a implementaĆ§Ć£o do evento click no botĆ£o Save. Mas agora nĆ³s ligaremos um mĆ©todo em um evento no input: quando o usuĆ”rio apertar Enter, o mĆ©todo changeTitle serĆ” chamado.

Evento 'keyup'

Quando o usuĆ”rio digita, eventos do teclado sĆ£o emitidos. Por exemplo, keydown e keyup. NĆ³s iremos usar o evento keyup (quando a tecla pressionada Ć© solta) e trocar o tĆ­tulo:

<input [value]="title" (keyup)="changeTitle('Button Clicked!')">

Agora, quando o usuƔrio digitar na caixa de input, o tƭtulo muda para "Button Clicked!". Mas continua uma string estƔtica.

Dica: Quando um elemento comeƧar a ficar grande devido aos atributos, para melhorar a visualizaĆ§Ć£o, vocĆŖ pode dividir em duas linhas:

<input [value]="title" 
       (keyup)="changeTitle('Button Clicked!')">

O objeto $evento

Agora sĆ³ queremos reagir quando o evento keyup ocorre. O Angular permite que nĆ³s utilizemos o prĆ³prio objeto do evento. Ele Ć© passado pela ligaĆ§Ć£o com o evento como $event - assim nĆ³s podemos utilizĆ”-lo quando chamamos changeTitle().

O objeto do evento emitido nos eventos keyup tem uma referĆŖncia ao elemento que emite o evento - o elemento de input. A referĆŖncia Ć© guardada numa propriedade do evento, chamada target. Como vimos anteriormente, o elemento de input tem uma propriedade value que segura a string que estĆ” no input. NĆ³s podemos passar $event.target.value para o mĆ©todo:

<input [value]="title" 
       (keyup)="changeTitle($event.target.value)">

Teste em seu navegador. Agora, com cada tecla apertada, vocĆŖ consegue ver as mudanƧas no tĆ­tulo e elas refletem o valor do input.

Apertando a tecla Enter

VocĆŖ pode limitar a mudanƧa a um clique de tecla, em seu caso Ć© o Enter. Angular deixa tudo bem mais fĆ”cil pra nĆ³s. O evento keyup tem propriedades que sĆ£o eventos mais especĆ­ficos. EntĆ£o, adicione o nome da tecla que seu evento escutarĆ”:

<input [value]="title" 
       (keyup.enter)="changeTitle($event.target.value)">

Agora o tƭtulo irƔ mudar apenas quando o usuƔrio apertar a tecla Enter enquanto digita no input.

Explore o $event

VocĆŖ pode mudar o mĆ©todo changeTitle para registrar o objeto $event no console. Dessa forma vocĆŖ pode explorar e ver quais propriedades ele tem.

Mude o mƩtodo para changeTitle:

changeTitle(event): void {
  console.log(event);
  this.title = event.target.value; // A funcionalidade original ainda funciona!
}

Agora, mude o argumento que vocĆŖ estĆ” passando, altere-o para passar o $event:

<input [value]="title" 
       (keyup.enter)="changeTitle($event)">

Teste!

NĆ£o esqueƧa de voltar para o cĆ³digo anterior, antes de continuarmos o tutorial!

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-input-button-unit',
  template: `
    <p>
      input-button-unit works!
      The title is: {{ title }}
    </p>

    <input [value]="title"
           (keyup.enter)="changeTitle($event.target.value)">

    <button (click)="changeTitle('Button Clicked!')">
      Save
    </button>
  `,
  styleUrls: ['./input-button-unit.component.css']
})
export class InputButtonUnitComponent implements OnInit {
  title = 'Hello World';

  constructor() { }

  ngOnInit() {
  }

  changeTitle(newTitle: string) {
    this.title = newTitle;
  }
}

Last updated