지시자 (Directive)
Written by niee on
Angular2 스터디 발표 자료
지시자는 템플릿내에서 사용되는 구성요소의 모양이나 구조를 결정, 컴포넌트 지시자, 구조 지시자, 속성 지시자, 커스텀 지시자가 있음.
- 선언형 프로그래밍과 지시자
- 커스텀 지시자
1. 선언형 프로그래밍과 지시자
- 선언형 프로그래밍은 순서나 문제해결 과정을 다루기보다, 무엇을 나타내야 할지에 관심.
- 선언형 프로그래밍의 예로 HTML이 있음
- HTML에서 중요한 것은 애플리케이션이 추구하는 목적에 부합하도록 엘리먼트를 배치했느냐
- angular도 선언형 프로그래밍 방식으로 개발
1-1. 지시자의 장점
- 템플릿에 가독성을 부여 : 지시자에 의미있는 이름을 부여하여 컴포넌트가 어떻게 동작할지를 예측가능.
- 코드 복잡도를 낮춤 : P.280 참조
1-2. 지시자(Directives)의 종류
- 컴포넌트 지시자 : 컴포넌트 템플릿을 표시하기 위한 지시자.
@Component({
selector : 'component-name'
})
export class ComponentClass{
}
- 구조 지시자 : Angular2에서 제공하는 내장 지시자이며 ng접두어가 붙어있음. 공식 사이트 참조
<span [ngSwitch]="조건"> <template [ngSwitchCase]="값"></template </span>
<ul *ngIf="show">
<li *ngFor="let i of list">
- 속성 지시자 : 네이티브 엘리먼트의 class, style 속성과 구분하기 위한 접두어로 ngClass, ngStyle 사용
<ul [ngClass]="className">
<li [ngStyle]="{'font-style':bold;}">
- 커스텀 지시자 : 사용자가 새롭게 추가할 수 있는 지시자.
2. 커스텀 지시자
- 컴포넌트와 별개의 파일에 정의.
- 네이밍 규칙은 파일명.directive.ts
2-1. 커스텀 지시자 샘플
//1. 커스텀 지시자 생성
import { Directive } from '@angular/core';
@Directive({
selector : '[my-click]',
host : { '(click)' : 'onClick()'}
})
export class MyClickDirective{
onClick(){
alert('Hello');
}
}
//2. 커스텀 지시자 사용 컴포넌트 생성
import { Component } from '@angular/core';
@Component({
selector: 'app-custom-directive',
template: '<button my-click> onClick() </button>'
})
export class CustomDirectiveCmp {
constructor() { }
}
//3. 모듈에 등록
import { CustomDirectiveCmp } from './custom-directive/custom-directive.component';
import { MyClickDirective } from './custom-directive/my-click.directive';
declarations: [
CustomDirectiveCmp, MyClickDirective,
]
2-2. selector와 @Input, @Attribute 장식자
- selector사용시 대괄호를 이용하면, 속성 바인딩을 이용한다.
- 대괄호를 이용하여 속성 바인딩이 적용되어 있으면
@Input
장식자로 값을 받아 들일수 있다. P.287참조 - 대괄호가 없는 일반 속성값을 받기위해선
@Attribute
장식자를 사용한다. P.288참조
2-3. 커스텀 지시자에 이벤트 추가
- 이벤트 추가는
host
속성과@HostListener
장식자를 이용한다.
//1. host속성
@Directive({
host : {
'(click)':'clickEvent()',
'(mousemove)':'mousemoveEvent()'
}
})
//2. @HostListener
import { HostListener } from '@angular/core'
@HostListener('click') clickEvent(){}
@HostListener('mousemove') mousemoveEvent(){}
2-4. ElementRef와 Renderer
- Angular는 DOM에 바로 접근하는 것을 허용하지 않는다.
- 만약 DOM을 직접 제어하고 싶다면
ElementRef
모듈을 이용한다. - 엘리먼트의 모양을 결정해야 하는것 같은 작업을 목적으로 한다면
Renderer
를 이용한다.
Comments