본문 바로가기

Web/Angular

[Angular] User Input - 사용자 입력

앵귤러의 사용자 입력에서 불필요한 코드를 제거하고 디펜던시를 제거할 수 있는 부분을 살펴보는 글입니다.

아래 코드들과 정보는 앵귤러 공식 문서를 참조했습니다.

 

angular에서 사용자 입력(input, click 등)을 받을 때 아래 코드처럼 $event를 통째로 넘기고 그 이벤트에 맞게 타입을 정의해서 사용할 수 있습니다.

 

아래는 keyup이라는 이벤트가 발생했기에 onKey() 함수에서의 파라미터 타입을 KeyboardEvent로 명시하여 사용합니다. 

 

@Component({
  selector: 'app-keyup',
  template: `
    <input (keyup)="onKey($event)">
    <p>{{values}}</p>
  `
})
export class KeyUpComponent_v1 {
  values = '';


  onKey(event: KeyboardEvent) { // with type info
    this.values += (event.target as HTMLInputElement).value + ' | ';
  }
}

 

하지만!! 이는 너무 많은 정보를 컴포넌트로 넘기는 것은 물론, html에서 어떤 이벤트가 발생했는지를 알아야만 넘어온 이벤트 데이터를 활용할 수 있다는 치명적인 단점이 있습니다. 즉, html과 component가 분리되지 않고 의존성을 가지게 되는 문제가 있는 것입니다.

 

그래서 angular 공식 문서에서는 아래의 방식을 추천합니다. 

 

@Component({
  selector: 'app-loop-back',
  template: `
    <input #box (keyup)="0">
    <p>{{box.value}}</p>
  `
})
export class LoopbackComponent { }

 

Template reference variables(#box)를 통해 component에는 필요한 정보를 주는 방식입니다.

아래는 value 정보만 컴포넌트로 넘겨 활용하는 예시 코드입니다.

 

@Component({
  selector: 'app-key-up2',
  template: `
    <input #box (keyup)="onKey(box.value)">
    <p>{{values}}</p>
  `
})
export class KeyUpComponent_v2 {
  values = '';
  onKey(value: string) {
    this.values += value + ' | ';
  }
}

 

또한, form을 submit할때에도 비슷하게 활용할 수 있습니다.

 

<form #itemForm="ngForm" (ngSubmit)="onSubmit(itemForm)">
  <label for="name"
    >Name <input class="form-control" name="name" ngModel required />
  </label>
  <button type="submit">Submit</button>
</form>

<div [hidden]="!itemForm.form.valid">
  <p>{{ submitMessage }}</p>
</div>

 

컴포넌트간의 dependency에 집중해왔었는데 html은 별로 고려하지 않았었다는 생각이 많이 드네요..! 

'Web > Angular' 카테고리의 다른 글

Rxjs duplicated assign issue  (0) 2021.02.17
[Angular] Pipe  (0) 2020.10.08
[Angular] Unsubscribe http request  (0) 2020.09.26
[Angular] Lazy-loading  (0) 2020.06.20