์๋ ํ์ธ์ Foma ์ ๋๋ค!
์ ๋ฒ ๊ธ์ Angular์ ์ด๋ฏธ ๊ตฌํ๋ Built-in ๋๋ ํฐ๋ธ์ ๋ํด์ ์์ ๋ณด์๋๋ฐ์.
์ด๋ฒ ๊ธ์ ์ง์ ์ปค์คํ ํ ๋๋ ํฐ๋ธ๋ฅผ ๋ง๋ค๊ณ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์ ๋ณด๊ฒ ์ต๋๋ค.
๋ฐ๋ก ์์ํ ๊ฒ์~
Generate Directive
์๋์ ๊ฐ์ด ๋๋ ํฐ๋ธ๋ฅผ ์์ฑํด ์ค๋๋ค.
์ ๋ mouse control์ ๋ฐ๋ผ ์คํ์ผ์ด ๋ฐ๋๋ ๋๋ ํฐ๋ธ๋ฅผ ๋ง๋ค๊ฑฐ๊ธฐ ๋๋ฌธ์ mouseControl์ผ๋ก ์ด๋ฆ ์ง์ด์ฃผ๊ฒ ์ต๋๋ค.
ng g d ๋๋ ํฐ๋ธ์ด๋ฆ
//or
ng generate directive ๋๋ ํฐ๋ธ์ด๋ฆ
directive.ts
์๋์ ๊ฐ์ด Directive๊ฐ ์์ฑ ๋ ๊ฑฐ์์.
@Directive์ selector๋ก app + ๋๋ ํฐ๋ธ์ด๋ฆ์ผ๋ก ๋ง๋ค์ด์ง๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
import { Directive } from '@angular/core';
@Directive({
selector: '[appMouseControl]',
})
export class MouseControlDirective {
constructor() {}
}
์ด์ ๋ง์ฐ์ค ์ปจํธ๋กค์ ๋ฐ๋ผ์ ์๋ฆฌ๋จผํธ ์คํ์ผ์ด ๋ฐ๋๋ ๊ฑธ ์์ฑํด ๋ณผ๊ฒ์.
๋จผ์ ๊ฐ์ ์๋ฆฌ๋จผํธ๋ก ๋ถํฐ ๊ฐ์ ์ ๋ฌ ๋ฐ์ @Input ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ง๋ค์ด ์ค๊ฒ์.
* @Input
ํ ํ๋ฆฟ์ DOM ํ๋กํผํฐ์ ๋ฐ์ธ๋ฉ ๋์ด ๋ณ๊ฒฝ๋๋ฉด ์๋์ผ๋ก ์ ๋ฐ์ดํธ ํด์ฃผ๋ ๋ฐ์ฝ๋ ์ดํฐ ์ ๋๋ค.
๋ฐฐ๊ฒฝ์, ํฐํธ ์ฌ์ด์ฆ, ํ ์คํธ ์ปฌ๋ฌ๋ฅผ ์ ๋ฌ ๋ฐ๋๋ก ๋ง๋ค์ด ์ฃผ๊ฒ ์ต๋๋ค.
import { Directive, ElementRef, HostListener, Input } from '@angular/core';
@Directive({
selector: '[appMouseControl]',
})
export class MouseControlDirective {
@Input('backgroundColor') backgroundColor: string = 'white';
@Input('fontSize') fontSize: number = 14;
@Input('textColor') textColor: string = 'black';
constructor(private el: ElementRef) {}
...
}
์ด์ mouse๊ฐ ํด๋น ์๋ฆฌ๋จผํธ์ ๋ค์ด์์ ๋์ ๋๊ฐ์ ๋ ์คํ์ผ์ด ์ ์ฉ๋๊ณ ํด์ ๋๋ ๊ฒ์ ๊ตฌํํด ๋ณด๊ฒ ์ต๋๋ค.
@HostListener ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ์ ๋ ฅ๊ฐ์ ๊ฐ์งํ๊ฒ ์ต๋๋ค.
* @HostListener
DOM์์ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ์คํํ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ ๋ฐ์ฝ๋ ์ดํฐ ์ ๋๋ค.
@HostListener('mouseenter') ๋ก ๋ง์ฐ์ค๊ฐ ํด๋น ์๋ฆฌ๋จผํธ์ ๋ค์ด์์ ๋ ์์์ @Input ๊ฐ์ ์ ๋ฌ ๋ฐ์ ์คํ์ผ ๊ฐ๋ค์ ์ ์ฉํด ์ค๋๋ค.
@HostListener('mouseleave')๋ก ๋ง์ฐ์ค๊ฐ ๋ฐ์ ๋๊ฐ์ ๋ style์ ๋ชจ๋ ํด์ ํด ์ค๋๋ค.
import { Directive, ElementRef, HostListener, Input } from '@angular/core';
@Directive({
selector: '[appMouseControl]',
})
export class MouseControlDirective {
...
@HostListener('mouseenter') onMouseEnter() {
this.el.nativeElement.style.backgroundColor = this.backgroundColor;
this.el.nativeElement.style.fontSize = this.fontSize + 'px';
this.el.nativeElement.style.color = this.textColor;
}
@HostListener('mouseleave') onMouseLeave() {
this.el.nativeElement.style = {};
}
}
component.html
์์์ ๋ง๋ ๋๋ ํฐ๋ธ๋ฅผ ์ ์ฉํ ํ ํ๋ฆฟ์ผ๋ก ์ด๋ํด ์ค๋๋ค.
์ํ๋ ์๋ฆฌ๋จผํธ ํ๊ทธ์ ๋๋ ํฐ๋ธ ์ด๋ฆ์ ์ ์ด ์ ์ฉํด ์ฃผ๊ณ , ์์์ ๋ง๋ @Input์ ์ ๋ฌํ ๊ฐ๋ค์ '[]'๋ฅผ ์ด์ฉํด ์ฐจ๋ก๋ก ๋ฃ์ด์ค๋๋ค.
<h1
appMouseControl
[backgroundColor]="'black'"
[fontSize]="36"
[textColor]="'white'"
>
๋๋ ํฐ๋ธ ํ
์คํธ
</h1>
๋๋ ํฐ๋ธ๋ฅผ ์ ์ฉํ๋ฉด '['๋ง ์์ฑํด๋ ์ด๋ฏธ ๋ง๋ค์ด์ค @Input ๊ฐ๋ค์ ๊ณ ๋ฅผ ์ ์์ต๋๋ค.
์คํ๊ฒฐ๊ณผ
๋ง์ฐ์ค๊ฐ ๋ค์ด์์ ๋
๋ง์ฐ์ค๊ฐ ๋๊ฐ์ ๋
์ฌ๋ฌ ์คํ์ผ ํ๋ฒ์ ์ ์ฉํ๊ธฐ
๋ง์ฝ ์ฌ๋ฌ ์คํ์ผ์ ํ๋ฒ์ ์ ์ฉํ๊ณ ์ถ๋ค๋ฉด @Input ๋ฐ์ฝ๋ ์ดํฐ์ ๊ฐ์ฒด ํํ๋ฅผ ๋ง๋ค์ด ์ค๋๋ค.
๊ทธ๋ฆฌ๊ณค renderer๋ฅผ ์ด์ฉํด์ ์ ๋ฌ๋ฐ์ ๊ฐ์ฒด ์์ ๊ฐ๋ค์ ์คํ์ผ๋ก ๋ชจ๋ ์ ์ฉ์์ผ ์ค๋๋ค.
directive.ts
import {
Directive,
ElementRef,
HostListener,
Input,
Renderer2,
} from '@angular/core';
@Directive({
selector: '[appMouseControl]',
})
export class MouseControlDirective {
@Input('styles') styles: any = {};
constructor(private el: ElementRef, private renderer: Renderer2) {}
@HostListener('mouseenter') onMouseEnter() {
Object.keys(this.styles).forEach((newStyle) => {
this.renderer.setStyle(
this.el.nativeElement,
`${newStyle}`,
this.styles[newStyle]
);
});
}
@HostListener('mouseleave') onMouseLeave() {
this.el.nativeElement.style = {};
}
}
component.html
@Input๊ฐ์ ์ ๋ฌํ ๊ฐ์ ๊ฐ์ฒด ํํ๋ก ์ ๋ฌํด ์ค๋๋ค.
<h1
appMouseControl
[styles]="{ backgroundColor: 'black', fontSize: '36px', color: 'white' }"
>
๋๋ ํฐ๋ธ ํ
์คํธ
</h1>
์คํ๊ฒฐ๊ณผ
์์ ๊ฐ์ด ์ ์ฉํด๋ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ต๋๋ค.
๋ง์ฐ์ค๊ฐ ๋ค์ด์์ ๋
๋ง์ฐ์ค๊ฐ ๋๊ฐ์ ๋
๋๊ธ