์ ๋ Angular 2๋ฅผ ํํค์ณค๊ณ ํน์ ์ข ๋ฅ์ ๊ตฌ์ฑ ์์๋ฅผ ํ์ฅํ๊ธฐ ์ํ ์ ์ฌ์ ์ธ ์ฅ์ ๋ฌผ์ ๋ถ๋ช์ณค์ต๋๋ค.
๋ค์ ์์ ์๋ ๋ฒํผ ๊ตฌ์ฑ ์์์ ํฐ์น ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์คํ์ผ์ ์ ์ฉํ๋ ์ง์๋ฌธ์ด ์์ต๋๋ค. ์ ํํ ๋์ผํ ํฐ์น ๋์์ ์์ํ๋ ๋ฒํผ ์ธ์๋ ๋ง์ ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ์์ต๋๋ค. ๋๋ ๋ด ์ต์ ์ ํ์ํ๊ณ , ๋๋ ๊ธธ์ ์์๋ค:
๋๋ฌด ๊น์ด ๋ค์ด๊ฐ์ง ์๊ณ componentMetadata๋ฅผ ๊ตฌ์ฑ ์์ ์ปดํ์ผ ์๊ฐ ๋์ ์ฌ์ฉํ ์ ์๊ณ ํธ์คํธ ์์ฑ์์ ๋์ ์ผ๋ก ์ถ๊ฐํ๊ณ ๋์์ ์ปดํ์ผํ ์ ์๋ ์ถ๊ฐ ์ง์๋ฌธ์ ๊ฒ์ํ ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ ๋ฐฉ์์ผ๋ก ๋ฏน์ค์ธ์ ์ํํ ์ ์์ต๋๋ค. ๊ตฌ์ฑ ๊ฐ๋ฅํ ์ง์๋ฌธ์ ์ฌ์ฉํ์ฌ ๊ธฐ๋ฅ์ ํ์ฅํ๊ณ ๋ทฐ ํฌ์์ ์ค๋จํ์ง ์๊ณ ์ํํ ์ ์์ต๋๋ค. ์๋์ ์งง์ ์.
ํ์ฌ ํ๋
componentMetadata.host์์ ์ง์๋ฌธ์ ์ ์ธํ๋ฉด ์ด๋ฅผ ์ผ๋ฐ ์์ฑ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
์์/์ํ๋ ํ๋
ํธ์คํธ์ ์ ์ธ๋ ์ง์๋ฌธ์ ์ปดํ์ผ ์๊ฐ์ ์ฒ๋ฆฌ๋ฉ๋๋ค.
/**
* App
*/
@Component({
selector: 'app-component',
template: '<g-btn>TEST</g-btn>',
directives: [gBtn, gTouch]
})
export class AppComponent {
constructor() {
}
}
/**
* Touch Directive
* Will be used in lots and lots of components
*/
@Directive({
selector: '[g-touch]',
host: {
'(touchstart)': '...',
'(touchend)': '...',
'(touchmove)': '...',
'(touchcancel)': '...'
}
})
export class gTouch {
constructor() {
}
}
/**
* Simple button component
*/
@Component({
selector: 'g-btn',
template: '<ng-content></ng-content>',
host: {
'role': 'button',
// WOULD LOVE FOR THIS TO COMPILE THE DIRECTIVE!
// right now it just adds an attribute called g-touch
'g-touch': ' '
}
})
export class gBtn {
constructor() {
}
}
์ด๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๋ํ ๋ช ๊ฐ์ง ์์ด๋์ด:
// Option 1: just scan the host properties for directives.
// This would be my ideal, simple and understandable
@Component({
selector: 'g-btn',
template: '<ng-content></ng-content>',
host: {
'role': 'button',
'g-touch': true // or {prop: 'foo'} or string
}
})
// Option 2: definitely more declarative using a hostDirectives property
// more declarative, albeit more annoying to have to reimport the touch class
@Component({
selector: 'g-btn',
template: '<ng-content></ng-content>',
hostDirectives: gTouch,
host: {
'role': 'button',
'g-touch': true
}
})
// Option 3: declare host directives as its own thing, still just
// use keys pointing to bool, obj, or string
@Component({
selector: 'g-btn',
template: '<ng-content></ng-content>',
hostDirectives: {
'g-touch': {someOption: someOption}
},
host: {
'role': 'button',
}
});
// Option 4: Not a huge fan of this one, but understandable if
// people want to keep one host property
@Component({
selector: 'g-btn',
template: '<ng-content></ng-content>',
host: {
'role': 'button',
_directives: {
'g-touch': true
}
}
});
๋ชจ๋์๊ฒ ๊ฐ์ฌํฉ๋๋ค. Angular 2๊ฐ ๋ฉ์ง๊ฒ ๋ณด์ ๋๋ค!. ๋ด๊ฐ ๋์น๊ณ ์๋ ๊ฒ์ด ์๋ค๋ฉด ์๋ ค์ฃผ์ธ์.
์ ๋ ํ์ฌ ๋๊ท๋ชจ ํด๋ผ์ด์ธํธ๋ฅผ ๊ฐ๋ฐ ์ค์ด๋ฏ๋ก ๋ชจ๋ GUI ๊ด๋ จ ๋ฌธ์ ๋ฅผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ Angular2 ์ง์๋ฌธ์ผ๋ก ๋ถํดํ๋ ค๊ณ ํฉ๋๋ค. James๊ฐ ์๋ฒฝํ๊ฒ ์ง์ ํ๋ฏ์ด ์ด๊ฒ์ ํญ์ ๋์ผํ ๋ฌธ์ ๋ก ์ด์ด์ง๋๋ค.
์ด๊ฒ์ ์ข์ ๋ชจ๋์ ๋ฐ ๋์ ์ํคํ
์ฒ๋ฅผ ์ํด ์ด๋ป๊ฒ๋ ์๋ํด์ผ ํฉ๋๋ค. ํฐ์น ์์ ๋ ์ด๊ฒ์ด ํ์ํ ๋ง์ ์๋๋ฆฌ์ค ์ค ํ๋์ผ ๋ฟ์
๋๋ค. ์: Drag&Drop, Resize ๊ด์ฐฐ ๋ฑ
plunker๋ก ๋ ๋ค๋ฅธ ์๋ฅผ ๋ง๋ค์์ต๋๋ค.
https://plnkr.co/edit/J65THEMic0yhObt1LkCu?p=info
์ด ๊ธฐ๋ฅ์ด ์กฐ๋ง๊ฐ ์ถ๊ฐ๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๊น?
๋ค์์ ์ด์ ๊ด๋ จ๋ StackOverflow ์ง๋ฌธ์ ๋๋ค. http://stackoverflow.com/questions/37148080/use-angular2-directive-in-host-of-another-directive
@Andy1605 ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์ด ์์ต๋๊น? ์ด ๋๋ฌธ์ RC ์ค์ NG2๋ก ์์ ํ ์์ ์ด์์ต๋๋ค. ๋ค์ ์ ํํ๊ณ ์ถ์ง๋ง ์ด ํน์ ๋ฌธ์ ๋ก ์ธํด ํ์ฅ ๊ฐ๋ฅํ UI ํจํด์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
๋๋ ๋ํ Angular๊ฐ ์ฌ๊ธฐ์ ํ์์ ์ธ ๊ธฐ๋ฅ์ ๋์น๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ตฌ์ฑ ์์๊ฐ ํธ์คํธ์ ๋ํ (์ฌ๋ฌ) ์์ฑ ์ง์๋ฌธ์ ์ ์ธํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ผ ํฉ๋๋ค. ๊ทธ๋ ๊ฒ ํ ์ ์๋ค๋ ๊ฒ๋ ์ ํ๋ก์ ํธ์ ํฐ ๊ฑธ๋ฆผ๋์ด ๋ฉ๋๋ค.
์ด๊ฒ์ด ๋ฏธ๋์ ๊ตฌํ๋ ๊ฒ์ธ์ง ๋๋ ์ํํ ์ ์๋ ์ด์ ๊ฐ ์๋์ง ์๋ ์ฌ๋์ด ์์ต๋๊น?
https://github.com/angular/angular.js/issues/15270 ์์ ์ด ๋ฌธ์ ์ ๋ํ ์๋ฃจ์ ์ ์ ์ํ์ต๋๋ค(๊ฐ๋ ๋ฒ์ 1์๋ ํด๋น)
๋ด ์๊ฐ์ ์ง์๋ฌธ์ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ ๋์ ์ปดํ์ผ ํ๋ ์์ํฌ์ ์์ ๋์ง ์์ ํํฐ๋ง๋์ง ์์ ๊ตฌ์ฑ ์์ ์ ์ธ์ ์ก์ธ์คํ ์ ์๋ "hostTransforms"(๊ฐ๋ 1์ ๊ฒฝ์ฐ "nodeTransforms")๋ผ๋ ์๋ก์ด ํ์ฅ ์ง์ ์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ตฌ์ฑ ์์๊ฐ ์ปดํ์ผ๋ฌ์ ์ํด ์ฒ์ ๋ฐ๊ฒฌ๋๊ณ DOM์ ์ฝ์ ํ ์ค๋น๊ฐ ๋ ๋๋ง๋ค ์๋์ ์ปดํ์ผ๋์ง ์์ ๊ตฌ์ฑ ์์ ํธ์คํธ ๋ ธ๋์ ๋๋ค. ์ด๋ฐ ์์ผ๋ก ๊ฐ๋ฐ์๋ ์ฌ์ฉ์ ์ง์ ์์ฑ์ผ๋ก ๊ตฌ์ฑ ์์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํ์ฅํ ๋ค์ nodeTransforms๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํ์ผ ์ง์ ์ ์ด๋ฌํ ์ฌ์ฉ์ ์ง์ ์์ฑ์ ๊ฐ๋ ํ๋ ์์ํฌ์ ์ต์ํ ๊ฒ์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค. ์์ ๋ ๊ธฐ๋ฅ ์์ฒญ ์ค๋ ๋๋ฅผ ํ์ธํ์ธ์.
์ ๋ Angular 2 ์์ค ์ฝ๋๋ณด๋ค Angular ์์ค ์ฝ๋์ ๋ ์ต์ํ๊ธฐ ๋๋ฌธ์ ๊ตฌํ ํ๋ก์ธ์ค๊ฐ ์ฌ๊ธฐ์์๋ ๋์ผํ ์ง ํ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ๊ฝค ์ธ๊ธฐ ์๋ ์์ฒญ์ธ ๊ฒ ๊ฐ๊ธฐ ๋๋ฌธ์ Angular 2๋ก ๊ตฌํ๋๊ณ ๋ฐฑํฌํธ๋๊ฑฐ๋ Angularjs๋ก ๊ตฌํ๋๊ณ ํฌ์๋ํฌํธ๋๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค(๊ทธ๊ฒ ๊ทธ๋ฐ๊ฐ์?).
+1
ํธ์คํธ์ ๊ธฐ์ฌํ๋ ์์ฑ ์ง์๋ฌธ์ ์ถ๊ฐํ ์ ์๋ ๊ธฐ๋ฅ์ด ํ๋ฅญํ ๊ฒ์ด๋ผ๋ ๋ฐ ๋์ํด์ผ ํฉ๋๋ค. ๋ด UI ๊ตฌ์ฑ ์์์ ๋๋๊ทธ/๋๋กญ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๊ฐ์ด ๋ "๊ฐ๋"๋ฅผ ๊ตฌํํ๋ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ง๊ธ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
host
๋ฉํ๋ฐ์ดํฐ ์์ฑ ๋์ ๊ตฌ์ฑ ์์์ ํ
ํ๋ฆฟ์ ์ ์ฉํ ์ ์๋ <ng-container>
์ ์ ์ฌํ ์ ํ๊ทธ๋ฅผ ๋ง๋๋ ๊ฒ์ ์ด๋ป์ต๋๊น? ์ง์๋ฌธ์ด ํธ์คํธ ๊ตฌ์ฑ ์์์ ์ถ๊ฐ๋์์์ ๋ํ๋ด๋ <ng-host [attributeDirective]>
์ ๊ฐ์ ๊ฒ์
๋๋ค.
@jjstreet ๊ทํ์ ์ ์์ replace: true
(๋ถ๋ช
ํ ๋์ผํ์ง๋ ์์ง๋ง ์ ์ฌํจ)์ ์ ์ฌํ๊ฒ ๋ค๋ฆฌ๋๋ฐ, ์ด๋ ์ผ๋ง ์ ์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ replace: true
๋ ์ฌ๊ธฐ์ ์ ์ฉ๋์ง ์๋ ์ด์ ๋ก ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
@pkozlowski-opensource ์ด์ ๋ํด ng2 ํ์ผ๋ก๋ถํฐ ์ด๋ค ์ข ๋ฅ์ ์๋ต์ ๋ฐ์ ์ ์์ต๋๊น?
๋๋ ์ด๊ฒ์ ๋ฌ์ฑํ๊ธฐ ์ํด ์ด๋ค ๋ฐฉ๋ฒ ์ผ๋ก๋ ๊ฒ์์ ๋๋ค. ํธ์คํธ ์์ฑ์ ๊ตฌ์ฑ ์์์ ๋ก์ปฌ ๋ฒ์์ ์ก์ธ์คํ ์ ์๊ณ ์ด๋ฏธ ๊ตฌ์ฑ ์์ ์์ฒด์ ์์ฑ์ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ์ ์ํ์ต๋๋ค. ์ง์๋ฌธ์ ์ด ๋์์ ์์ฐ์ค๋ฌ์ด ํ์ฅ์ฒ๋ผ ๋ณด์ ๋๋ค.
+1 ์ด ๊ธฐ๋ฅ์ UI ๊ตฌ์ฑ ์์์ ๊นจ๋ํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋๊ฐ ์์ด์ผ ํฉ๋๋ค.
+1
์ด์ ๋ํด ng2 ํ์ผ๋ก๋ถํฐ ์ด๋ค ์ข ๋ฅ์ ์๋ต์ ๋ฐ์ ์ ์์ต๋๊น? ๊ทธ๋ฅ ํ์ง ์๊ฒ ๋ค๋ ๋ง์ด๋, ์ข์ ์๊ฐ์ด์ง๋ง ํ์ฌ ์ฐ์ ์์๊ฐ ์๋๋ผ๋ ๋ง์ด๋ผ๋, ์กฐ๊ธ์ด๋๋ง ์๊ฒฌ์ ๋ฃ๊ณ ์ถ์ต๋๋ค.
์ด์ ๋ํ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ต๋๋ค. ng2-mobx(https://github.com/500tech/ng2-mobx)๊ฐ ํฌ์ฅ ๊ตฌ์ฑ ์์๋ฅผ ์ ๊ฑฐํ๊ณ ํจ์ฌ ๋ ๊นจ๋ํด ๋ณด์ด๊ฒ ํ ์ ์์ต๋๋ค.
์ด๊ฒ๋ ๊ฐ๊ณ ์ถ์ต๋๋ค. ํ์ฌ ์ฌ์ฉ์ ์ ์ routerLink
์ง์๋ฌธ์ ๋ง๋๋ ๋ฐ ํ์ํฉ๋๋ค. ๊ฐ๋๋ฅผ ์ฌ์ฌ์ฉํ๊ณ mi ์ง์๋ฌธ์ผ๋ก ์ค๋น๋ ๋งค๊ฐ ๋ณ์๋ฅผ ์ ๊ณตํ๊ณ ์ถ์ต๋๋ค.
๋ฐ๋ผ์ <a [routerLink]="repeatedCodeToGetLink()">
๋์ <a [myRouterLink]>
์๊ณ ํด๊ฒฐ๋ ๋งค๊ฐ๋ณ์์ ํจ๊ป [routerLink]
๋ฅผ ๋์ ์ผ๋ก ์ ์ฉํฉ๋๋ค.
์ด๊ฒ์ ์ ๋ง์ ๋ํด ์ ๋ง ํฅ๋ถ๋ฉ๋๋ค!
์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์ ์ ๋์ ํ์๋ก ํ์ต๋๋ค. ์ฌ์ค, ๊ณต๊ฐ๋ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์ ์๊ธฐ ์ ์ ์คํ ์ค๋ฒํ๋ก ์ ๋ํด ๋ณธ์ง์ ์ผ๋ก ๋ฐ๋ก ์ด ๊ธฐ๋ฅ์ ๋ํด
์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ ์ ๋์ ์ด์ด ๋ https://github.com/angular/flex-layout/issues/162 ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ๊ตํ ์๋ฅผ ์ ๊ณตํ์ต๋๋ค. ( ์์ ๋ฐ ์ค๋ช ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ์ญ์์ค )
์ฐ๋ฆฌ๋ ํผ๋๋ฐฑ์ ์ ๋ง ๊ธฐ๋ํ๊ณ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ ์ด ๋ฆฌํฌ์งํ ๋ฆฌ์ ์๋ ๋ชจ๋ ๋ฏธํด๊ฒฐ ๋ฌธ์ ์ค์์
/cc @tbosch @IgorMinar @mhevery @jelbourn @hansl @ThomasBurleson
@jjstreet ๋๋ ๋น์ ์ ์ ์์ ์๊ฐํฉ๋๋ค
<ng-host myDirective="foo"></ng-host>
... ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ๋ ผ์ํ๋ ๊ฒ๊ณผ๋ ๋ค๋ฅธ ์ด์ ๋ก ์ผ๋ง ์ ์ ๋ง๋ค์ด์ง ๋ ๋ค๋ฅธ ๋ณ๋์ ์ ์๊ณผ ์ ์ด์ธ๋ฆฝ๋๋ค.
ํ์ฌ ๋ถ๋ชจ ๊ตฌ์ฑ ์์์ ์ง์๋ฌธ์ ์ถ๊ฐํ ๋ค์ @HostListener๋ฅผ ์ฌ์ฉํ์ฌ ํธ์คํธ์ ์์ ๊ธฐ๋ฅผ ์ถ๊ฐํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
๋ถ๋ชจ.html
<my-component myDirective>
Component.ts
@HostListener('myEvent')
handler() {
// do stuff
}
๊ทธ๋ฌ๋ ํธ์คํธ์์ ์ง์ ์์ฑ์ ์ถ๊ฐํ ์ ์๋ค๋ฉด ๋ ๊นจ๋ํ ๊ฒ์ ๋๋ค...
๋ค์์ ๋ด๊ฐ ์ด ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ ๋ฐฉ๋ฒ์ ๋๋ค. ํ์ง๋ง ์ด ๊ธฐ๋ฅ์ ์ฒ์๋ถํฐ ๊ตฌํํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ์๋ฃจ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
Angular ํ์์ ์ด์ ๋ํ ๊ธ์ ์ ๋๋ ๋ถ์ ์ ์ธ ์๊ฒฌ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์์ ๋งค์ ์๋ฆผ์ ๋๋ค.
@tbosch - ์ด ๋ฌธ์ ์ ์ฐ์ ์์์ ๋ํ ๋ชจ๋ ๋์ค์ ์๊ฐ. @angular/flex-layout
์๋ ์ํฅ์ ์ค๋๋ค.
@fadzic ์ด๋ ๊ฒํ๋ฉด ํธ์คํธ ์์์ ์ง์๋ฌธ์ ์ถ๊ฐ ํ ์ ์์ต๋๋ค ...
Component.ts
@HostBinding('attr.myHilite') myHilite = new myHiliteDirective()
๋๋ ElementRef ๋๋ Renderer2์ ๊ฐ์ ๋งค๊ฐ๋ณ์๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ด์ ๊ฐ์ด
@HostBinding('attr.myHilite') myHilite = new myHiliteDirective(this.elementRef, this.renderer)
๋ํ ํธ์คํธ ์์์ ์ง์๋ฌธ์ ์ถ๊ฐํด์ผ ํ๋ฉฐ ์ด ๋ฌธ์ ๋ก ๋ฆฌ๋๋ ์ ๋์์ต๋๋ค. ์์ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ์์ ์ ์ํํ ์ ์์์ต๋๋ค. ์ ๋ Angular๋ฅผ ์ฌ์ฉํ๋ ์ ๋ฌธ๊ฐ๋ ์๋์ง๋ง ๋๊ตฐ๊ฐ๊ฐ ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ฌธ์ ๊ฐ ์์ผ๋ฉด ์๋ ค์ฃผ์ธ์. ๊ฐ์ฌ ํด์.
์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๊ฐ ํธ์ถ๋์ง ์๊ธฐ ๋๋ฌธ์ ์๋ํ์ง ์๋ @btinoco ์ ๋๋ค. Angular๊ฐ ์ฐ๊ฒฐํ๋ ๋์ ์ง์๋ฌธ์ ์ฌ์ฉํ๋ ๊ฐ ๊ตฌ์ฑ ์์์ ๋ชจ๋ ๊ฒ์ ์๋์ผ๋ก ์ฐ๊ฒฐํด์ผ ํฉ๋๋ค.
@hccampos ๊ฐ์ฌํฉ๋๋ค. ๋ฐฉ๊ธ ์๋ํ๋๋ฐ ๋ด ์ง์๋ฌธ์ ngOnInit
๊ฐ ์คํ๋์ง ์์๊ฑฐ๋(๋ด ๊ตฌ์ฑ์์์์ ์ง์๋ฌธ์ ์๋์ผ๋ก ์ฌ์ฉํ์ง ์๋ ํ) ๋ด ๊ตฌ์ฑ์์์ ngOnInit()
์์ ์ง์๋ฌธ์ ngOnInit()
๋ฅผ ํธ์ถํฉ๋๋ค. . ๋ค์ ํ๋ฒ ์๋ ค์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
@btinoco - ๋ค. ๋ฏธ๋ฌํ์ง๋ง ๋ถ์พํ ๋ฌธ์ ์ ๋๋ค. @angular/flex-layout์ด ๊ณง ์์ ๋๊ธฐ๋ฅผ ๋ฐ๋ผ๋ ๊ฒ์ ๋๋ค. ;-)
์ด์ ๋ํ Angular ํ์ ์์์ด ์์ต๋๊น? ์ด์๊ฐ ๋์ง 1๋ ์ด ๋์๋๋ฐ..
์ด ๋ฌธ์ ์ ๋ํ ์์ธํ ์ค๋ช
์ ์ฐพ๋ ๊ฒ์ ๋งค์ฐ ์ข์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ Angular ํ์์ ํผ๋๋ฐฑ์ ์ฐพ์ง ๋ชปํ ๊ฒ์ ์ ๋ง ๋ฉ์ง์ง ์์์ต๋๋ค.
์ด๋ฏธ ์๋ํ๋ ์๋ฃจ์ ์ ๊ดํ์ฌ:
์ด ๊ธฐ๋ฅ ์์ฒญ์ ๋ฏน์ค์ธ๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค. ์ฌ์ค ์ค๋ช
์ 2๋ฒ ๊ธ๋จธ๋ฆฌ ๊ธฐํธ๋
์ด ๊ธฐ๋ฅ์ ์ค์ ๋ก ๊ณต์๊ณผ ์ผ์นํฉ๋๋ค.
TypeScript ๋ฌธ์๋ ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐ
Angular์์๋ @Input()
ํด๋์ค๋ฅผ ํผํฉํ๋ ๊ฒ๊ณผ ๊ฐ์ด ์กฐ๊ธ ๋ ๋๋น ์ง๋๋ค.
๊ธฐ๋ณธ ํด๋์ค์์ ๋ค์ ์ ์ธํด์ผ ํฉ๋๋ค.
์ค๋๋ ์ด๋ฏธ ์๋ํ๊ณ ์๋ ๋ ๋ค๋ฅธ ์๋ฃจ์
์ ๊ตฌ์ฑ ์์์ ๋ํผ ์์๋ฅผ ํฌํจํ๊ณ ๊ฑฐ๊ธฐ์ ์ง์๋ฌธ์ ์ ์ฉํ๋ ๊ฒ์
๋๋ค.
์๋ฅผ ๋ค์ด ๊ตฌ์ฑ ์์์ <wrapper g-touch>...
์ ๊ฐ์ ํ
ํ๋ฆฟ์ด ํฌํจ๋ ๊ฒฝ์ฐ
"elementRef.nativeElement์์ ์ง์ ์๋น์ค๋ฅผ ํตํด ์ํํ๋ ๋์ฐ๋ฏธ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ"์ ๊ด๋ จํ์ฌ:
๋ค, ๊ทธ๊ฒ๋ ์ข์ ์๊ฐ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ์ง๊ธ WebWorkers์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์์ ๊ฒ์
๋๋ค.
์์ง ์คํ์ ์ด๋ฉฐ ํ๋ก๋์
์ ์ํ ๋ช ๊ฐ์ง ๋ ํฐ ๊ธฐ๋ฅ์ด ์๊ธฐ ๋๋ฌธ์
WebWorkers์์ ์๋ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ฑฐ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด DOM์ ์ง์ ์ก์ธ์คํ๋ ์ฌ๋ฃ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฐธ์กฐํ์ญ์์ค.
์ ์์ ์ต์ 1)์ ๊ดํ์ฌ:
ํธ์คํธ ์์ฑ ๋ฐ์ธ๋ฉ์ ๋ํ ํ์ฌ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ธฐ๋ณธ HTML ์์์ myDir
์์ฑ์ ์ค์ ํ๊ณ
๊ทธ๋ฌ๋ ์ด๋ค ์ง์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ host
๋ ์ง์๋ฌธ์ ๋์
ํ ์ ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ์๋ ๋ค์์ ์์ฑํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด myDir
์ง์๋ฌธ์์ ์์ฑ์ ์
๋ฐ์ดํธํ์ง ์๋ ์ด์ ๋ฅผ ํผ๋ํ ๊ฒ์
๋๋ค.
@Component({
host: {
'[myDir]': true
},
template: '...'
})
class MyComp {}
์ต์
1) ๋ฐ ์ต์
3) ๊ด๋ จ:
๋์ผํ ์์์ ์ง์๋ฌธ ์ฌ์ด์ ์ผ์ข
์ host
๋ฐ์ธ๋ฉ์ ๋์
ํ๋ฉด ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
์ ์์ ์ต์ 2)์ ๊ดํ์ฌ:
gTouch
ํด๋์ค๋ฅผ ์ฐธ์กฐํด์ผ ํ๋ ๊ฒ์ด ์ด์ํด ๋ณด์
๋๋ค.NgModule
๋ฅผ ํตํด ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.@ThomasBurleson ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ์คํ๋ผ์ธ์์ ๋ ์์ธํ ์ด์ผ๊ธฐ
@tbosch ์ ๋ ๋ ๋ค๋ฅธ ์ต์
์ ์ ์ํ๊ณ ์ถ์ต๋๋ค. ๋ค์ดํฐ๋ธ Angular ํ๊ทธ๋ฅผ ๋์
ํ๊ณ <ng-host>
๋ผ๊ณ ๋ถ๋ฅด๊ฒ ์ต๋๋ค.
์ฐธ๊ณ : @mhevery ๋ https://github.com/angular/angular/issues/7546 ์
<ng-host>
ํ๊ทธ ๋์ ์ ์ ์ํ์ง๋ง ์ฌ๊ธฐ์์ ๋์ผํ ํ๊ทธ ์ด๋ฆ์ ์ฌ์ฉํ๊ณ ์์์๋ ๋ถ๊ตฌํ๊ณ ์ ์์ ๋ณ๋์ด๋ฉฐ ์ฌ๊ธฐ์์ ์ ๊ธฐ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค.
ng-host
ํ๊ทธ๋ ์ผ๋ฐ ์ง์๋ฌธ/์ปดํฌ๋ํธ ํด๋์ค๋ก ๊ตฌํ๋์ง ์๊ณ ๋์ "๋ง๋ฒ" ํ๋ ์์ํฌ ์ฝ๋๊ฐ ๋ฉ๋๋ค... ng-content
, ng-container
๋ฑ๊ณผ ์ ์ฌํฉ๋๋ค. .,
ํ๊ทธ๋ CSS :host
์ ํ๊ธฐ์ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ ์์ ํธ์คํธ์ ๋ํ "ํฌ์ธํฐ" ์ญํ ์ ํฉ๋๋ค.
๋ชจํธํ ์๋๋ฆฌ์ค๋ฅผ ํผํ๊ธฐ ์ํด ๊ฐ ๊ตฌ์ฑ ์์๋ ์ต๋ ํ๋์ <ng-host>
๋ธ๋ก
์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
// Option 5: Use `<ng-host>`.. Very declarative and intuitive
@Component({
selector: 'g-btn',
template: `
<!--
Besides comments, having dom code inside the template but outside of a declared
ng-host code block would raise an error (hopefully at compile-time) .
-->
<ng-host role="button" g-touch>
<ng-content></ng-content>
</ng-host>
`
})
๊ทธ๊ฑด ๊ทธ๋ ๊ณ @tbosch , ๋ต๋ณ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด ๋ฌธ์ ์ ๋ํ ๊ทํ์ ์ฐธ์ฌ์ ํผ๋๋ฐฑ์ ์ง์ฌ์ผ๋ก ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์ด ๊ธฐ๋ฅ์ ๋ํ ๋ค๋ฅธ ์ฌ๋๋ค์ ์๊ฐ์ ๊ตฌ์ฑ ์์์๋ง ํด๋น๋ฉ๋๊น, ์๋๋ฉด ์ง์๋ฌธ์ด ํธ์คํธ์ ๋ค๋ฅธ ์ง์๋ฌธ์ ์ ์ฉํ ์ ์๋ค๋ฉด ์๋ฏธ๊ฐ ์์ต๋๊น? ์ฌ์ฉ ์ฌ๋ก A) ๋์ค์ ๋ณ๊ฒฝํ๋ ค๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ์ฝ๋์์ ๋ถ๋ฆฌํ๊ณ B) ๋ณต์ ํ์ง ์๊ณ ๊ฐ ์ธ์คํด์ค์ ์ผ๋ถ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ์ ์ฉํ๋ ค๋ ๋ช ๊ฐ์ง ํ์ฌ ์ง์๋ฌธ์ ๋ํด ์ด ๋ฌธ์ ๋ฅผ ๊ตฌ๋ ํ๊ธฐ ์์ํ์ต๋๋ค. ์ฌ์ฉํ ๋๋ง๋ค ์ค์ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ๊ฑธ์ณ ๋ง์ ์์ ์์์ ์ ์ฉ๋ ํดํ ์ง์๋ฌธ๊ณผ ์ง์ฐ ๋ฐ appendToBody๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ๋ ค๊ณ ํฉ๋๋ค(์ค์ ์ง์ค์ ๊ตฌ์ฑ ๊ฐ์ฒด๋ฅผ ์ง์ํ์ง ์์). ์ค์ ๊ตฌ์ฑ ๊ฐ์ฒด๋ฅผ ์ง์ํ์ง ์์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ๋ ค๋ ๋ชจ๋ ๊ณณ์ 3~4๊ฐ์ ์์ฑ์ ๋ฃ์ด์ผ ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ค์ ์ฐ๋ฆฌ๋ ๊ฒฐ๊ตญ ๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ฉ์ด์ง๊ฒ ๋์๊ณ (Material ํดํ์ ์ฌ์ฉํ๊ธฐ ์์ํจ) ๋ชจ๋ ํดํ์ ์๋์ผ๋ก ๊ต์ฒดํด์ผ ํ์ต๋๋ค. "๋ํ"ํ๋ ์์ฒด ์ง์๋ฌธ์ ๋ง๋ค ์ ์์๋ค๋ฉด [mdTooltip]์ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋์ ํธ์คํธ์ ์ ์ฉํ๋๋ก ํด๋น ์ง์๋ฌธ์ ๋ณ๊ฒฝํ๋ ๊ฒ๋ง ํผ ๊ฐ๋จํ์ ๊ฒ์ ๋๋ค.
@MikeMatusz ์ ๋ ๊ทธ๊ฒ์ ์ผ๋์ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฌ๊ธฐ https://github.com/angular/flex-layout/issues/162#issuecomment -290350270์ ์ค๋ํซ์ด
@Directive({
selector: 'fxLayoutFullPage',
hostDirectives: [LayoutDirective],
host: {
'fxLayout': 'column',
'style': 'min-height:100vh; background-color:yellow'
},
}) class LayoutFullPageDirective {}
์ง์๋ฌธ์ ์ธ์คํด์คํํ๋ ์์ฑ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ง๋ค ์ ์์ต๋๊น?
์๋ฅผ ๋ค์ด:
@HostDirective(LayoutDirective) myLayoutDirective: LayoutDirective;
์ด๊ฒ์ ๊ตฌ์ฑ ์์ ๋ฐ ์ง์๋ฌธ์ ๋ํด ์๋ํ๊ณ ์ํธ ์์ฉ์ ์ํ ์ธ์คํด์ค ์ฐธ์กฐ๋ฅผ ์ ๊ณตํ๋ฉฐ ๊ตฌ์ฑ ์์/์ง์๋ฌธ์์ ์์ํ ๋ ์์ค๋์ง ์์ต๋๋ค.
์
๋ ฅ ๋ฐ ์ด๋ฒคํธ ๋ฐ์ธ๋ฉ๋ ์ ๊ณตํ๋ ค๋ ๊ฒฝ์ฐ ๋ ๋ณต์กํด์ง๋๋ค.
์ด๊ฒ์ ์ด๋์ ์ ์์ต๋๊น? ์ ๋ Angular2/4๋ฅผ ์ฒ์ ์ ํ๊ณ ํ ๋ฒ์ ์ฌ๋ฌ ๋ค๋ฅธ ์ง์๋ฌธ์ ์ ์ฉํ๋ ์ง์๋ฌธ์ ๋ง๋ค๊ณ ์ถ์ต๋๋ค. ๋ค์ ๋์ :
<button directiveA directiveB directiveC>BUTTON TEXT</button>
๊ทธ๋ฅ ์ธ ์ ์์ต๋๋ค :
<button customDirectiveABC>BUTTON TEXT</button>
๊ธฐ๋ณธ ๊ตฌ์ฑ/DRYness๊ฐ ์ฌ์์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ด๊ฐ ๋งํ ์์๋ ํ ๊ทธ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๊น?
https://github.com/angular/flex-layout/issues/76#issuecomment -310509013๋ ์ฐธ์กฐ
@soynog , ์ ๋ ๋๊ฐ์ ๋๋์ ๋๋ค. ๋ํ ์ด๊ฒ์ด ์ด๋์ ์๋์ง ์๊ณ ์ถ์ต๋๋ค.
md-dialog-container
์ง์๋ฌธ์ ๋์ ์ผ๋ก ์ถ๊ฐํ๊ณ ์ถ์ Angular Material ๋ฐ angular2-dragable(angular/material#1206์ ์์ง ์ง์๋์ง ์๊ธฐ ๋๋ฌธ์)์ ์ฌ์ฉํ์ฌ ๋๋๊ทธ ๊ฐ๋ฅํ ๋ํ ์์๋ฅผ ๋ง๋ค ์ ์๊ธฐ๋ฅผ ๋ฐ๋์ต๋๋ค MdDialog
์๋น์ค๋ ์์ฑํ์ง๋ง ๋์ ์ง์๋ฌธ์ ๋ํ Angular 1.x ์ปดํ์ผ๋ฌ์ ๋์์ ์ฌ๊ธฐ์์ ์ป๋ ๊ฒ์ด ํจ์ฌ ๋ ์ด๋ ค์ ๋ณด์
๋๋ค.
@tbosch , @ThomasBurleson , Thomas๊ฐ angular/material#1206์์ ์ฐ์ฐํ ์ ๊ธฐํ ๋ฌธ์ ๋๋ ๋ชฉํ์ ๊ด๋ จ๋ ์คํ๋ผ์ธ ์ฌ์ฉ ์ฌ๋ก์ ๋๊น? 1.6.x์ 2+ ํ๋ ์์ํฌ ์ฌ์ด์ ๋์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด ์ค๋ช ํ๋ ค๊ณ ํฉ๋๋ค.
์ด ๋ฌธ์ ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? ์ด๋ฐ์ ์ฃผ๋ชฉ์ ๋ฐ์์ง๋ง ๋ ์ด์ ์ฃผ๋ชฉ๋ฐ์ง ๋ชปํ๋ ๊ฒ ๊ฐ์์.
์, ๊ทธ๊ฒ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
์ด๊ฒ์ ๋ด๊ฐ ๋งค์ฐ ํ์๋ก ํ๋ ๊ฒ์ ๋๋ค. ์ด ์ ์์ด ๊ทธ์ ๋ฐฉ์์ผ๋ก ์๋ฅ์ ๋๋ฌํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ด๊ฒ์ ์ข์ ๊ฒ์ ๋๋ค. ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก/๋์ ์ผ๋ก ์ง์๋ฌธ์ ์ ์ฉํ ์ ์๋ค๋ ์ฌ์ค์ ๊นจ๋ซ๊ณ ์ฌํผ์ก์ต๋๋ค.
+1
์ ๋ ๋ง์ฐฌ๊ฐ์ง์์ :)
์ฌ๋ฌ ์ง์๋ฌธ ๋ฐ์ธ๋ฉ์ ํ์ํ ๋ชจ๋ ์์
์ ์ํํ๋ ์ฌ์ฉ์ ์ง์ ์ง์๋ฌธ์ผ๋ก ๋ํํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด :
<my-cmp [myDirective]="content"
[isOpen]="myCondition"
customProp2="customClass"
customProp1="customText">
...
</my-cmp>
๋ชจ๋ ์ค์ ๋ณต์ฌ/๋ถ์ฌ๋ฃ๊ธฐ ์์ด ์ฌ์ฌ์ฉํ ์ ์๋๋ก ๋ชจ๋ ๊ฒ์ ๋ํํ๋ ์ง์๋ฌธ์ ๋ง๋ค ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
<my-cmp myCustomDirective>
</my-cmp>
๊ทธ๋ฆฌ๊ณ ๋ด ์ฌ์ฉ์ ์ง์ ์ง์๋ฌธ์
<ng-host [myDirective]="content"
[isOpen]="myCondition"
customProp2="customClass"
customProp1="customText">
</ng-host>
์ด๋ฒ ํธ์ 2์ฃผ๋ ์ ๋ง์! ์์งํ ์ด ๊ธฐ๋ฅ์ ๋งค์ฐ ์ ์ฉํ๋ฏ๋ก ์๋ฐฑ๋ง ๊ฐ์ ๋ํผ๋ฅผ ๋ง๋ค์ง ์๊ณ ๋ ๊ณ ๋๋ก ๊ตฌ์ฑ ๊ฐ๋ฅํ ๊ตฌ์ฑ ์์์ ์ง์๋ฌธ์ ๋ง๋ค ์ ์์ต๋๋ค. ๊ฐ์ง๊ณ ์๋ ์ง์๋ฌธ์์ ํ์ํ ๊ตฌ์ฑ ์์๋ฅผ ๊ตฌ์ฑํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๊ฐ๋จํ๊ณ ๊นจ๋ํ๋ฉฐ ํจ๊ณผ์ ์ ๋๋ค.
@IgorMinar- ์ด์จ๋ ์ฐ๋ฆฌ๋ ํฅํ ๊ฐ์ ์ฌํญ์ ๋ํด ๋ ์ด๋์ ์ด ๊ธฐ๋ฅ์ ์ป์ ์ ์์ต๋๊น?
๊ทธ๋ฌํ ๊ธฐ๋ฅ์ด ๋์ ํจํด์ผ๋ก ๊ฐ์ฃผ๋๋์ง ์๊ณ ์ถ์ต๋๋ค. ๋๊ตฌ๋?
@darkbasic - AFAIU, ์ด ๊ธฐ๋ฅ์ด ์์ผ๋ฉด ๊ฐ๋ฐ์๋ ๋จ์ํ ๋ถ๋ชจ ์ง์๋ฌธ์ ํ
ํ๋ฆฟ ๋ณด๊ธฐ ๋ฐ ์ฝํ
์ธ ์ ์ถ๊ฐํ๊ธฐ ์ํด ๋ํผ ์์( ng-container
)๋ฅผ ๋์
ํด์ผ ํฉ๋๋ค.
์๋์, ๋ํผ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ตฌ์ฑ ์์๋ฅผ ์์ ํ ์ ์ดํ ์ ์๋ ๊ฒ์ด ๋์ ํจํด์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ํ์ํ์ ๋๋ค.
@bradlygreen ์๊ฒฌ์ด
์ด ๊ธฐ๋ฅ์ ์ด ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ชจ๋ ๊ณต๊ฐ ๋ฌธ์ ์ค์์ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ์์ฒญ(์์ 5๊ฐ๋ ์๋ ๊ฒฝ์ฐ)์ ๋๋ค... ์ธํฐ๋ท์ ํตํด ์ฌ์ค์ ํ๋ ์์ํฌ๋ก์ Angular๊ฐ ์ ํดํ๋ค๋ ๋ณด๊ณ ์(์ค์ฆ์ ๋ฐ์ดํฐ๋ก ๋ท๋ฐ์นจ๋จ)๋ฅผ ๋ณด๊ณ ์์ต๋๋ค... ์ ์๊ฐ์๋ ์ปค๋ฎค๋ํฐ๊ฐ ๋ค๋ฆฌ์ง ์๋๋ค๋ ๊ฐ์ ์ ์ผ์ผํค๋ ์์ธ ์ค ํ๋์ ๋๋ค. ๊ฒฝ์; vue.js ๋ฐ react๋ ๋ชจ๋ ์ฌ๋์ด ์ํ๋ ๋ชจ๋ ์์ ๊ฒ์ ๋ฐ๋์ ๊ตฌํํ์ง๋ ์๋๋ผ๋ ์ต์ํ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ์์ฒญ ํญ๋ชฉ์ ๋ํ ์ง์์ ์ธ ํผ๋๋ฐฑ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ฐ์ ํ๋ณดํ๊ณ angular๋ฅผ ๋ฅ๊ฐํ์ต๋๋ค. ๋๋ฌด ์ค๋ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ์๋ฌด ์๋ฆฌ๋ ๋ค๋ฆฌ์ง ์๋ ๊ฒ์ด ๋๋ฌด ๋ต๋ตํฉ๋๋ค. ๊ฐ๋จํ "์๋์, ์ฐ๋ฆฌ๋ํ์ง ์์ ๊ฒ์ ๋๋ค".
( "Angular slips" Js ํ๋ ์์ํฌ ์น์ ์ฐธ์กฐ)
... Angular / Vue / React / ...์ ๋ํ ์ผ๋ถ ์๊ฒฌ์ ๋ค์ํ ์์ธ์ ์ํฅ์ ๋ฐ๋๋ค๊ณ ์๊ฐํ์ง๋ง ... ์ด ๊ตฌ์ฒด์ ์ธ ๊ธฐ๋ฅ์ ์ค์ ๋ก ์ด๋ค ํํ์ ๊ตฌํ ๊ฐ์น๊ฐ ์์ ๊ฒ์ ๋๋ค. ์ ์ฉ๋ ๋๋ ํฐ๋ธ์ ๊ฐ๋จํ ๋ชฉ๋ก์ด ์๋ ์๋ฃจ์ ) ... ๊ทธ๋์ Angular ํต์ฌ ํ์ ๊ตฌ์ฒด์ ์ธ ์์น๋ ๋งค์ฐ ํ์๋ฐ์ ๊ฒ์ ๋๋ค ... ๐ฅ
ํน์ ETA๋ ์์ง๋ง 2018๋ ๋ ๋๋ฌ์์ ์ด ๋ฒ์ฃผ๋ฅผ ํจ์ฌ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค.
2018๋ ์๋ ์ํฉ์ด ํฌ๊ฒ ๊ฐ์ ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ณด๋ค:
@somombo ์ด ๊ธ์ ์ค๋์ ์ ํ์๋ฆฌ๋ก ํ์ธ๋์์ต๋๋ค
์ค์ ๋ก ์์ ์ ๋ฌผ๊ฑด์ ์๋ ์ฌ๋๋ค์ ์๊ฐ๋ฅผ ๋น์๊ณ ์๋ฌด๋ ์ง์งํ๊ฒ ๋ฐ์๋ค์ด์ง ์์์ต๋๋ค.
๋ฐ๋ผ์ ๋ฌธ์ ์ ์ฌ์ค์ ์ฌ๊ธฐ์์ ์ด ๋ฌธ์ ๊ฐ Angular ํ์ ๋ํด ๋งค์ฐ ๋ฎ์ ์ฐ์ ์์๋ผ๋ ๊ฒ์ ๋๋ค. ์ฌ์ค ๊ทธ๊ฒ์ ๊ฐ๋ฅํ ๊ฐ์ฅ ๋ฎ์ ์ฐ์ ์์์ ๋๋ค.
AngularHQ์ ๊ฒ์๋ ์ฐ์ ์์ ๋ชฉ๋ก์ ์ฐธ์กฐํ์ญ์์ค (๋ฌธ์ ๋ฒํธ 8785 ์ฐธ์กฐ).
์ด ๋ฌธ์ ๋ ๋๊ธ ์์์ ์ ์ ์๋ฏ์ด ์ปค๋ฎค๋ํฐ์์ ๋ง์ ํ ๋ก ๊ณผ ๊ด์ฌ์ ๋ถ๋ฌ ์ผ์ผ์ผฐ์์๋ ๋ถ๊ตฌํ๊ณ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
์ด ๋ฌธ์ ์ ๊ด์ฌ์ด ์๊ณ ์ค์ ๋ก ๊ตฌํ๋๊ธฐ๋ฅผ ์ํ๋ ์ฌ๋์ด๋ผ๋ฉด.. ์์งํ _์ ์ฌ์ ์ผ๋ก๋ ์ ๋_ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๊ณต์ ์ฐ๋ก Angular Survey๋ฅผ ์์ฑํ๊ณ ์ด ๋ฌธ์ ์ ๋ํ ๋๋์ ์๋ฆด ์ ์์ต๋๋ค. ๋ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ ธ์ผ ํ๋ฉฐ ๋์ค์ ๋ณด๋ค ๋นจ๋ฆฌ ์ถฉ์กฑ๋๋ ๊ฒ์ ๋ณด๊ณ ๊ฐ์ฌํ ๊ฒ์ ๋๋ค.
Angular ํ์ด ์ํํ ๋ชจ๋ ํ๋ฅญํ ์์ ์ ๋ํด ๊ฐ์ฌํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค!
๋ํ ์ด ๊ธฐ๋ฅ์ ํ ํ๋ฅผ ๋์ง๊ณ ์ถ์ต๋๋ค. ์ด๊ฒ์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ๋๋ฌด ๋ง์ ์ฌํ์ ์์ธ์ด ๋์์ต๋๋ค.
@somombo ์์ง AngularHQ์ ์ฐ์ ์์์ ๋ํด ๋๋ฌด ๋ง์ด ์ฝ์ง ๋ง์ญ์์ค. ์ฐ์ ์์ ๊ณต์์ ์์ ํ ๊ตฌ์ฒดํ๋์ง ์์์ต๋๋ค. ํ์ง๋ง v6์ด ์ถ์๋ ํ ์ด ๊ธฐ๋ฅ ์์ฒญ์ ๋ค์ ๊ฒํ ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด์ ๋ํ ๋์ญํญ์ด ๋ ๋นจ๋ฆฌ ํ๋ณด๋์ง ์์ ์ด์ ๋ํ ์์ ์ด ์ปดํ์ผ๋ฌ/์ฝ์ด ์์ญ์์ ์ด๋ฏธ ์งํ ์ค์ธ ์์ ๊ณผ ์ถฉ๋ํ๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ๋น ๋ฅธ ์์ ์์ฒญ์ด ์๋๋๋ค. ์ ๋๋ก ํ๋ ค๋ฉด ์๋นํ ๋ ธ๋ ฅ์ด ํ์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง, ์ฐ๋ฆฌ๊ฐ v6์ ์ํด ์์ ํ๊ณ ์๋ ๊ฒ์ ์ด๊ฒ์ ๊ตฌํํ๊ธฐ ํจ์ฌ ์ฝ๊ฒ ๋ง๋ค ๊ฒ์ ๋๋ค.
@IgorMinar Ivy ์์ ์ ์ด๊ฒ์ ๋ ์คํ ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค. ๊ทธ๋ฌ๋ ์ ๊ณผ๊ฑฐ v6.
@IgorMinar ๋ฐ @mhevery ๊ทํ๊ฐ ๊ทํ์ ์๊ฐ์ด ๋ฌด์์ด๋ฉฐ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์ ์ ๋จผ์ ๋ฐ์ํด์ผ ํ๋ ์ฌํญ์ ๋ํ ๊ตฌ์ฒด์ ์ธ ํผ๋๋ฐฑ์ ์ ๊ณตํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ ๋๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
๋ฌด์์ด "๋น ๋ฅธ ์์ "์ด๊ณ ๋ฌด์์ด ๊ทธ๋ ์ง ์์์ง ์ฐ๋ฆฌ ํ์ ๋์๊ฒ ํญ์ ๋ช ํํ ๊ฒ์ ์๋๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ๋น ๋ฅธ ์์ ์ ํ์ด ์๋๋ฉฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ํ๋์ด์ผํ๋ค๋ ์ฌ์ค์ ์ ์ธํ๊ณ ๋ ์ด๊ฒ์ด angular์ ์ ์ฉํ ๊ธฐ๋ฅ์ด ๋ ๊ฒ์ด๋ผ๊ณ ๋๋ผ์๋ ๊ฒ ๊ฐ์์ ํนํ ๊ฐ์ฌํฉ๋๋ค.
์ฐ๋ฆฌ๋ ๋น์ ์ด ๋งค์ฐ ๋ฐ์๊ณ ๋ชจ๋ ๋จ์ผ ๋ฌธ์ ์ ๋ํด ์ด๋ ๊ฒ ๋ต๋ณํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
๊ทธ๋์ ๋น์ ์ ๋น์ ์ด ํ ๋๋ง๋ค ์ฐ๋ฆฌ์ ์ง์ฌ ์ด๋ฆฐ ๊ฐ์ฌ๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ Angular v6 ๋ฐ ๊ทธ ์ดํ ๋ฒ์ ์ ๊ธฐ๋ํ๊ณ ์์ต๋๋ค!
๋ชจ๋ ํ๋ฅญํ ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
์ปดํฌ๋ํธ ํด๋์ค๊ฐ ์ง์๋ฌธ ํด๋์ค๋ฅผ ํ์ฅํ๊ฑฐ๋ ๊ตฌํํ๋๋ก ํ ์ ์์ต๋๋ค. ๋ด๋ถ์ ์ผ๋ก ์ง์๋ฌธ์ ์ ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ๊ตฌ์ฑ ์์์ ๋ ผ๋ฆฌ์ผ ์ ์์ต๋๋ค.
export class gBtn extends gTouch
@NateMay , ๋จ์ผ ํด๋์ค๋ง ํ์ฅํ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ ์ง์๋ฌธ์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๊ดํ ๊ฒ์ ๋๋ค.
@NateMay ๊ทธ๊ฒ์ ๋ํ ๋ ๊ฐ์ง ๋ฌธ์ - ์ฒซ์งธ, ๋จ์ผ ํด๋์ค๋ง ํ์ฅํ ์ ์๊ณ ๋์งธ, ์ข ์์ฑ ์ฃผ์ ์ ์ค๋จํ์ต๋๋ค.
๋ด 2์ผํธ๋ง ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค. @uirouter/angular์ ์ค์ฒฉ ์ํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋, ์ฌ๋ฃ ๋ฐ ํ๋ ์ค ๋ ์ด์์์ด ์๋ ๋ค์ค ๋ ์ด์ด SPA๋ฅผ ๊ตฌ์ถ ์ค์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ตฌ์ฑ ์์ ์์์ ํ๋ ์ค ์ง์๋ฌธ์ ์ฝ๊ฒ ์ ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋งค์ฐ ์ ํ์ ์ ๋๋ค.
๋ฐ๋ผ์ ์ด ๊ธฐ๋ฅ์ ํฌํํ์ญ์์ค.
์ด ์ถ๊ฐ๋ ๊ธฐ๋ฅ์ ๋ํด +1
DOM์ ํ์๋์ง ์๋ ng-container
์ง์๋ฌธ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๊ต์ฐจ ๊ด์ฐฐ์ API(์์๊ฐ ๋ทฐํฌํธ์ ๋ค์ด์ค๊ฑฐ๋ ๋๊ฐ ๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํด)์ ๋ํด ์ด๊ฒ์ด ํ์ํ์ต๋๋ค. ์์๊ฐ ํ์/์จ๊ธธ ๋ enter()
๋ฐ leave()
์ด๋ฒคํธ๊ฐ ์๋ intersector
์ง์๋ฌธ์ด ์์ต๋๋ค. ์ด API๋ฅผ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํด์ผ ํ๋ ํน์ ๊ตฌ์ฑ ์์๊ฐ ์์ง๋ง ํ
ํ๋ฆฟ์ ์ถ๊ฐ DIV๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ง ์์์ต๋๋ค.
๊ทธ๋์ ๋ด๊ฐ ํ ์ผ์ component.html
์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<ng-container intersector (enter)="weCameOnScreen()" (leave)="byeBye()">
... components normal template ...
</ng-container>
๊ทธ๋ฐ ๋ค์ intersector.directive.ts
์ง์๋ฌธ ์์ฑ์๋ ElementRef
์ฝ์
ํฉ๋๋ค.
constructor(private intersectorElementRef: ElementRef) { ... }
์ผ๋ฐ DOM ์์์ ๊ฒฝ์ฐ intersectorElementRef.nativeElement
์์ ์์
ํ์ง๋ง ng-container
๊ฒฝ์ฐ ๋
ธ๋๋ ์ค์ ๋ก ์ฃผ์ ๋
ธ๋์
๋๋ค. ๊ทธ๋์ ๋๊ธ์ธ์ง ํ์ธ๋ง ํ๊ณ , ๋๊ธ์ด๋ฉด ํ ๋จ๊ณ ์ฌ๋ผ๊ฐ๋๋ค.
public ngAfterViewInit(): void
{
// if the directive is applied to an ng-container must go a level up
this.domElement = (this.intersectorElementRef.nativeElement.nodeType == 8) ? this.intersectorElementRef.nativeElement.parentElement : this.intersectorElementRef.nativeElement;
registerIntersector(this.domElement ...);
๋ชจ๋ ์ํฉ์ ์ ์ฉ๋๋ ๊ฒ์ ์๋์ง๋ง ํ์ฌ๋ก์๋ ๊ด์ฐฎ์ต๋๋ค. ๋๋ IVY ์ปดํ์ผ๋ฌ์์ ๋ ์ด์ ์ฃผ์์ ์ฌ์ฉํ์ง ์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋์ ์ด๊ฒ์ด ๊นจ์ง ์ ์์ต๋๋ค. ์ค์ํ ๊ฒ์ ๋ด๊ฐ DOM ๋ ธ๋์์ ์ฌ์ฉํ ์ ์๋ ๋จ์ผ ์ง์๋ฌธ์ด๋ ์ง์๋ฌธ์ ๋ํ ๊ฐ์ง ' @HostBinding '์ผ๋ก ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
์ง์๋ฌธ์ ๋์ ์ผ๋ก ์ถ๊ฐํ ์ ์๊ธฐ๋ฅผ ์ ๋ง๋ก ๋ฐ๋์ต๋๋ค. ๋ ๋ฎ์ ์์ค์ ์ง์๋ฌธ์ "๊ณ ์ฐจ", ๋ ์ถ์์ ์ธ ์ง์๋ฌธ์ผ๋ก ์บก์ํํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค. ์คํ ์ค๋ฒํ๋ก์ ๋ํด ๋ค์๊ณผ ๊ฐ์ ์ง๋ฌธ์ ํ๋๋ฐ, ์์ผ๋ก ์ด์ ๋ํ ํด๊ฒฐ์ฑ ์ด ์์์ง ๊ถ๊ธํฉ๋๋ค. https://stackoverflow.com/questions/51608645/abstract-away-leaflet-directive-in-custom-directive
@mhevery๊ฐ ๋งํ๋ฏ์ด.. ์ฐ๋ฆฌ๋ ์ธ๋ด์ฌ์ ๊ฐ๊ณ ์์ด๋น ์ ์ฒด ๋ฒ์ (ng v7.0.0 ?)์ด ์ถ์๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค. ๋ถ๋ช ํ ์์ด๋น๋ก ๊ตฌํํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ฌ์ธ ๊ฒ์ ๋๋ค... ์์ด๋น ์ดํ์๋ ์ด ๊ธฐ๋ฅ์ด ์ฐ๋ฆฌ์๊ฒ ์ผ๋ง๋ ์ค์ํ์ง ํ์ ์๊ธฐ์์ผ ์์ง ์๋๋ก ํด์ผ ํฉ๋๋ค ๐
์ด์ ๊ฐ์ ํฉ๋๋ค. ๋ํ resolveComponentFactory/createComponent๋ก ์์ฑํ ๊ตฌ์ฑ ์์์ ์ง์๋ฌธ์ ๋์ ์ผ๋ก ์ฐ๊ฒฐํ ์ ์์ด์ผ ํฉ๋๋ค.
const componentFactory = this.componentFactoryResolver.resolveComponentFactory(componentItem.component);
const componentRef = viewContainerRef.createComponent(componentFactory);
(<DynamicComponent>componentRef.instance).data = componentItem.data;
(<DynamicComponent>componentRef.instance).cssClassList = componentItem.cssClassList;
// Add directive to new component here
// componentRef.addDirective(someDirective)
๋ชจ๋ ์
๋ฐ์ดํธ???
ํ์ฌ ์ง์๋ฌธ์ ์ฌ์ฉํ๋ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก์ ๋ถ๋ช์ณค์ต๋๋ค
์ผ๋ถ ์๋๋ฆฌ์ค์์๋ HTML ์์์ ๋ํ ์ง์๋ฌธ์ ๋์ ์ผ๋ก ์ ๊ฑฐ/์ถ๊ฐํด์ผ ํฉ๋๋ค.
์ด๋ค ์ ์ผ๋ก๋ ๊ฐ๋ฅํ๊ฑฐ๋ ์์ง ์๋ฃจ์
์ ๋ณด๋ฅ ์ค์
๋๊น?
@micronyks ... ์ค์ ๋ก ์ง์๋ฌธ์ ๋์ ์ผ๋ก ์ถ๊ฐํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๋ฌํ ๊ธฐ๋ฅ์ ๋ง๋ค ๊ฐ๋ฅ์ฑ์ ์ถ๊ฐํด์ผ ํ๋ Ivy๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค.
@mlc-mlapis ํ์ง๋ง IVY๋ ์ธ์ ์ฌ ๊ณํ์ธ๊ฐ์? ์ด๋ค ๋ฒ์ ์์?
@micronyks ... ์ผ์ ์ ๋ฐ๋ผ Angular 7.
์ฌ๊ธฐ์์ ํฉ๋ฆฌ์ ์ผ๋ก ์๊ฐํฉ์๋ค. Angular ํ์ ์์๊ฐ ๋ง์ ๋ช ๊ฐ์ง ๊ฑฐ๋ํ ๊ธฐ๋ฅ(PWA, SSR, Ivy, ํนํ Custom Elements)์ ๋ํด ์ด์ฌํ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. ๋ง์ดํฌ๋ก์ํํธ์ ๊ฐ์ ๋๊ธฐ์ ๋ค์ด ์์ํ ๊ทธ๊ฒ์ ์๊ตฌํด์๊ณ , ๊ฑฐ๊ธฐ์๋ ์ด์ ๊ฐ ์์ต๋๋ค. ํจ์จ์ ์ธ ์ฌ์ฉ์ ์ ์ ์์๋ฅผ ๋ฌ์ฑํ๋ ค๋ฉด Ivy๊ฐ ํ์ํฉ๋๋ค. @mhevery๊ฐ ๋งํ๋ฏ์ด Ivy๋ฅผ ์ฌ์ฉํ๋ ์ฆ์ ์์ง์ด ๋์ ์ง์๋ฌธ์ ๋ ์ฝ๊ฒ ํ์ฉํ ๊ฒ์ ๋๋ค.
๊ทธ ๋์์ ์ด ๊ธฐ๋ฅ์ ๊ณ์ ์๊ตฌํ๋ ๋์ (์ ๋ btw๊ฐ ํ์ํฉ๋๋ค) ๋ฒ ํ ํ ์คํธ, ๋ฒ๊ทธ ๋ณด๊ณ , ๋ฌธ์ ์ง์ ๋ฑ์ ํตํด Angular ํ์ด ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํ๋๋ก ๋์ธ ์ ์์ต๋๋ค.
Angular Team์ ๊ทธ๋ ๊ฒ ํฌ์ง๋ ์๊ณ ๋ชจ๋๋ฅผ ์ํ ๋ฉ์ง ํ๋ ์์ํฌ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ ธ๋ ฅํ๋ ์์ญ ๋ช ์ ์ฌ๋๋ค์ ๋ถ๊ณผํ์ง๋ง ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค๋ ๊ฒ์ ๊ธฐ์ตํฉ์๋ค.
... ๋ค, ์ง๊ธ์ ์กฐ๊ธ ์ฐธ์ ํ์๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ Ivy์ ๋ํด ๋ ๋ง์ ๊ฒ์ ๋์ธ ์ ์๋ ์๊ฐ๊น์ง ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค... ์ปดํ์ผ๋ฌ๊ฐ ์๋ฃ๋๊ณ ์ผ๋ถ ์ธ๋ถ ์ค๊ณ ๋ฌธ์๊ฐ ์ ๊ณต๋ ๋์ ๋๋ค.
@avatsaev ๋๋ ๋น์ ์ด ๋งํ ๋ชจ๋ ๊ฒ์ ๋์ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ฌผ๊ฑด์ ์๊ตฌํ๋ฉด ์ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ Angular๋ก ์์ ํ ๋ ๋ค๋ฃจ๋ ๋ฌธ์ ๋ฅผ ์ค๋ช ํ ์ ์์ต๋๋ค.
์ ๋ ๊ฒฝํ์ด ํ๋ถํ Angular ๊ฐ๋ฐ์๊ฐ ์๋์ง๋ง ์ผ๋ถ ์ฌํญ์ด ์๋ชป๋์๊ฑฐ๋ ๋ช ํํ๊ฒ ์ค๋ช ๋์ง ์์์ต๋๋ค.
๋์ ์ถ์ํ ์์ด ํ์ฌ ๊ตฌ์ฑ ์์/์ง์๋ฌธ์ ์บก์ํํ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ด๊ฒ์ ์ผ๋ถ๋ ๋์ ์ง์๋ฌธ์ ๊ฐ์ง ์ ์๊ฒ ํ๋ ๊ฒ์ ๋๋ค. ๋๋ฅผ ๋๋ผ๊ฒ ํ๋ ๊ฒ์ ๊ทธ๋ฌํ ์ผ์ ๋ฌ์ฑํ๋ ๊ฒ์ด ์๋นํ ๋ณต์กํ๋ค๋ ๊ฒ์ ๋๋ค.
JSON ๊ตฌ์ฑ์ ์ทจํ๊ณ ์์์ ์์ฑํ๋ Angular Material ๋ฐ Flex-Layout์ ์ฌ์ฉํ์ฌ ์์ ์์ฑ๊ธฐ๋ฅผ ๊ตฌ์ถ ์ค์ ๋๋ค. ์ด ๊ธฐ๋ฅ์ ๋ฐํ์์ ํธ์คํธ ๊ตฌ์ฑ ์์์ flex-layout ์ง์๋ฌธ์ ์ ์ฉํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. Angular์ ๊ฐ์ฅ ํฐ ์์ฐ ์ค ํ๋๋ ๊ตฌ์ฑ์์ ๋ฐํ์์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ธฐ๋ฅ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ ํด๋น ์ฝ๋๋ฅผ ๋ณด๋ค ๋ค์ํ๊ฒ ๋ง๋๋ ๋ฐ ํฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค. ์ข์ ์ฌ์ฉ ์ฌ๋ก์ ๋น ์ง๊ณ ์ถ์์ต๋๋ค. ์ง์ฆ ๋ ;)
๊ทธ๊ฒ์ด ๋์ ์ ํํ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค.
@NateMay ๋น์ ์ด ๊ทธ๊ฒ์ ํ์ธํ๊ณ ์ฌ๊ธฐ ๋ด ๊ตฌํ์ด ์์ต๋๋ค.
@NateMay ๋น์ ์ด ๊ทธ๊ฒ์ ํ์ธํ๊ณ ์ฌ๊ธฐ ๋ด ๊ตฌํ์ด ์์ต๋๋ค.
์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น? ๋๋ ๋น์ ์ด dynamic-field.directive ๋ฅผ ์๋ฏธํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
dynamic-field.directive
๋ ๋ฉ์ง ์ผ์ ํ์ง๋ง ๋ค๋ฅธ ๋ง์ ์ผ๋ค๋ ์ผ์ด๋๊ณ ์์ต๋๋ค. ๋ฐฉ๊ธ ๋ก์ปฌ ์ค์ ์ ๋ํ ์ง์นจ์ด ์๋ ๋ฃจํธ ํด๋์ CONTRIBUTING.md
๋ฅผ ์ถ๊ฐํ์ต๋๋ค. ๋ช ๋ฌ ๋์ ํ๋ก๋์
๋จ๊ณ์ ์๋ ๋ชจ๋ ํญ๋ชฉ์ ์ฌ์ฉํ์ง ์๋๋ก ์ฃผ์ํ์ญ์์ค. ์์ ์ ์ธ ๊ตฌํ์ ์ํด ์์
ํ๋ฉด์ ํฐ ๋ณํ๋ฅผ ๋ง๋ค๊ณ ์์ต๋๋ค.
+1
has-it
, ๋ด ๊ตฌ์ฑ ์์ ํด๋์ค ๋ด์์ ํด๋น ์ง์๋ฌธ์ผ๋ก ์ ๋ฉค๋ฒ ์์ฑ์ ์ ์ํ๊ณ ํด๋น ์์ฑ์ ํจ์๋ฅผ ํธ์ถํ ๋ ํ์ํ ๋ชจ๋ ์์ฑ์ ์ธ์๋ฅผ ํด๋น ์ง์๋ฌธ์ ์ ๋ฌํฉ๋๋ค(์: ElementRef, ViewContainerRef, TemplateRef... ์์ฒญํ๋ ๋ชจ๋ ์ฃผ์
๊ฐ๋ฅํ ๋ณ์). , ํ์ฌ ๊ตฌ์ฑ ์์์ ํด๋น ์๋ช
์ฃผ๊ธฐ ์ฝ๋ฐฑ ํจ์์ ngInit()
ngAfterViewInit()
์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ํด๋น ์๋ช
์ฃผ๊ธฐ ์ฝ๋ฐฑ์ ์๋์ผ๋ก ํธ์ถํฉ๋๋ค.@component(...)
class MyComponent {
theDirective: TargetDirective;
constructor(el: ElementRef) {
this.theDirective = new TargeDirective(el);
}
ngOnInit() {
this.theDirective.ngOnInit();
}
...
}
<ng-template><div targetDirective>....</div></ng-template>
ngAfterViewInit()
๊ณผ ๊ฐ์ด const vf = this.viewContainerRef.createEmbeddedView(this.templateRef);
vf.detectChanges();
์ด๋ฐ ์์ผ๋ก Angular๋ DOM ํธ๋ฆฌ์ ์๋ ๊ตฌ์ฑ ์์ ๋ฐ๋ก ๋ค์ ํด๋น ์ง์๋ฌธ๊ณผ ๋ด ๊ตฌ์ฑ ์์์ ์ค์ ์ฝํ
์ธ ๊ฐ ํฌํจ๋ ๋ ๋ค๋ฅธ element
๋ฅผ ๋ง๋ญ๋๋ค.
<my-component></my-component>
<div targetDirective>....</div>
์ด ๋ฐฉ๋ฒ์ <route-outlet>
๊ฐ ํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
๋ช ๋ฐฑํ ๋ถ์์ฉ์ด ์๋ค
์ด๊ฒ์ด ์ด์ Ivy์์ ๊ฐ๋ฅํ์ง ๋๊ตฐ๊ฐ ํ์ธํ ์ ์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ์๋ฅผ ๋ค์ด๋ณธ ์ฌ๋์ด ์์ต๋๊น?
Angular Team์ ๊ทธ๋ ๊ฒ ํฌ์ง๋ ์๊ณ ๋ชจ๋๋ฅผ ์ํ ๋ฉ์ง ํ๋ ์์ํฌ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ ธ๋ ฅํ๋ ์์ญ ๋ช ์ ์ฌ๋๋ค์ ๋ถ๊ณผํ์ง๋ง ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค๋ ๊ฒ์ ๊ธฐ์ตํฉ์๋ค.
๊ธฐ์ฌ์ ์ปค๋ฎค๋ํฐ๊ฐ ์์ผ๋ฉด ๋ ์ปค์ง ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด์ ๋ํ ๊ธฐ์ฌ ์์ ์ด ์๋ฝ๋ ๊ฐ๋ฅ์ฑ์ ๋งค์ฐ ๋ฎ์ต๋๋ค.
๊ทธ๋์ ๋์ ์ฐ๋ฆฌ๋ 12๋ช ์ ์ฌ๋๋ค๋ก ๋์๊ฐ๋๋ค.
์ด๊ฒ์ด ์ด์ Ivy์์ ๊ฐ๋ฅํ์ง ๋๊ตฐ๊ฐ ํ์ธํ ์ ์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ์๋ฅผ ๋ค์ด๋ณธ ์ฌ๋์ด ์์ต๋๊น?
์์ง ์๋ฌด ๋ง๋ ์์๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ์ฐพ์ ์ ์๋ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฒ์ ์ ๊ณตํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ์ด๊ฒ์ Ivy๋ก ๋ฏน์ค์ธ์ ๊ตฌํํ๋ ๊ฒ์ ๋ํ ์ผ๋ง ์ ์ ๊ธฐ์ฌ์ ๋๋ค: https://blog.nrwl.io/metaprogramming-higher-order-components -and-mixins-with-angular-ivy-75748fcbc310
๊ธฐ์ฌ์ ๋ฐ๋ฅด๋ฉด ์ด ์ค๋ ๋์ ์๋ ๋ฌธ์ ์ ๋ํ ๊ฐ๋ฅํ ํด๊ฒฐ์ฑ ์... "๊ธฐ๋ฅ"์ด๋ผ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
...์ด ๊ธฐ๋ฅ์ ๋ํด Google์์ ๋ฌด์์ด๋ ์๋ํ๋ ๊ฒ์ด ์ฝ๊ฐ์ ์ ๋ชฝ์ด๋ผ๊ณ ์์ํ ์ ์์ต๋๋ค. ๊ณง ๊ณต์ Ivy ๋ฌธ์๊ฐ ์ถ์๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค! :)
@nayfin ์ ๋ํ ์๊ฐ์ ์์ ๋์์ด๋/๋น๋๋ฅผ ๊ตฌ์ถํ๊ณ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ช ๋ฌ ๋์ ์์
์ ํ๋ค๊ฐ ๋์ ์ผ๋ก ์ถ๊ฐ๋ div์ ์ง์๋ฌธ์ ๋ฐฐํฌํ ๋ฐฉ๋ฒ์ด ์๋ค๋ ์ฌ์ค์ด ์ ๋ฅผ ๋ฏธ์น๊ฒ ๋ง๋ญ๋๋ค. MyDirectiveFactory::apply(HTMLElement)
์ด ๊ธฐ๋ฅ์ ์ต์์ ์ง์๋ฌธ์ ์ฒจ๋ถํ๊ธฐ ์ํด ํญ์ ํ๋์ div
๋ฅผ ๋ง๋ค๊ณ ์๊ธฐ ๋๋ฌธ์ ์๋์ ์ผ๋ก ํ์๋ฐ์ ๊ฒ์
๋๋ค. ๋ํ flex-layout ์ง์๋ฌธ์ ์ํ๋ฉด ์ผํ์ฉ div๋ ๋ง๋ค์ด์ผ ํ๋ฉฐ ์ด๋ฅผ ์ํํ์ง ์๊ณ ํธ์คํธ ์์์ ์ง์ ์ฐ๊ฒฐํ ์ ์์ผ๋ฉด ์ข์ ๊ฒ์
๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์ง์๋ฌธ์ ๋์ ์ผ๋ก ์ถ๊ฐํ ์ ์๋ค๋ฉด ์ ๋ง ๋ฉ์ง ๊ฒ์ ๋๋ค.
const msked = componentFactory.createDirective(MaskedInputDirective);
msked.textMaskConfig = {};
this.elementRef.directives.add(msked);
๋ํ flex-layout ์ง์๋ฌธ์ ์ํ๋ฉด ์ผํ์ฉ div๋ ๋ง๋ค์ด์ผ ํ๋ฉฐ ์ด๋ฅผ ์ํํ์ง ์๊ณ ํธ์คํธ ์์์ ์ง์ ์ฐ๊ฒฐํ ์ ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
@tsteuwer ํญ์
ํ์ง๋ง ์, ํธ์คํธ ์์์ ์ง์๋ฌธ์ ์ ์ฉํ๋ ๊ธฐ๋ฅ๋ ๊ฐ๊ณ ์ถ์ต๋๋ค. ํธ์คํธ ์์๋ฅผ ์คํฌ๋กค ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ณ Angular Material CDK์์ CdkScrollable์ ์ ์ฉํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
์ต์์ ng ํ ํ๋ฆฟ ๋ด ๊ตฌ์ฑ ์์ ํ ํ๋ฆฟ์ ๋ชจ๋ ๊ฒ์ ๋ํผ
์ด๊ฒ์ ๋ํ ์ฝ๊ฐ ๋ ๋งค๋๋ฌ์ด ๋์์ https://github.com/trotyl/angular-contrib ์ ์ฌ์ฉํ๊ณ ๋ค์์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค.
host: { ngNoHost: '' }
์ด ํ๋ก์ ํธ๋ ๋ ๋๋ฌ๋ฅผ shimํ๊ณ ๋ถ๋ชจ๊ฐ ์๋ ngNoHost ์์ฑ์ด ์๋ ์์์ ์์์ ๋ ๋๋งํฉ๋๋ค.
๋ฌผ๋ก ๋์ผํ ๋จ์ ์ด ๋ง์ด ์์ต๋๋ค.
3๋ ์ด ์ง๋ ์ง๊ธ๊น์ง ์ด๋ ค์๋ค๋ ์ํ๊น๋ค์. ํธ์คํธ ์์์ ๋ฐ์ธ๋ฉ๋ ์ง์๋ฌธ์ ์ฝ๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ์ฑ์ ์ค์ ๋ก ํฅ์์ํต๋๋ค.
๋ํ flex-layout ์ง์๋ฌธ์ ์ํ๋ฉด ์ผํ์ฉ div๋ ๋ง๋ค์ด์ผ ํ๋ฉฐ ์ด๋ฅผ ์ํํ์ง ์๊ณ ํธ์คํธ ์์์ ์ง์ ์ฐ๊ฒฐํ ์ ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
@tsteuwer ํญ์
ํ์ง๋ง ์, ํธ์คํธ ์์์ ์ง์๋ฌธ์ ์ ์ฉํ๋ ๊ธฐ๋ฅ๋ ๊ฐ๊ณ ์ถ์ต๋๋ค. ํธ์คํธ ์์๋ฅผ ์คํฌ๋กค ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ณ Angular Material CDK์์ CdkScrollable์ ์ ์ฉํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
์ด์์ ์ด์ง๋ ์์ง๋ง ๋ค์๊ณผ ๊ฐ์ด ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก CdkScrollable์ ๋ง๋ค ์ ์์ต๋๋ค.
this.scrollable = ์๋ก์ด CdkScrollable(this.elementRef, this.scrollDispatcher, this.zone);
this.scrollable.ngOnInit();
์๋์ผ๋ก๋ ํ๊ดดํด์ผ ํฉ๋๋ค.
if (this.scrollable) {
this.scrollable.ngOnDestroy();
}
https://github.com/angular/angular/issues/8785#issuecomment -361004682 IgorMinar Ivy ์์ ์ ํตํด ์ด๋ฅผ ๋ณด๋ค ์คํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ๊ณผ๊ฑฐ v6.
@mhevery ๊ทํ์ ์๊ฒฌ์ ๋ํ ํ์ ์กฐ์น:point_up_2:, ์ด์ Ivy๊ฐ ๋ง์นจ๋ด ์์ ํ ์๋ฅํ์ต๋๋ค. v10 ๋ฆด๋ฆฌ์ค(๋๋ ๊ทธ ์ด์ )์ ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๊น? ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๋ค๋ฅธ ๊ณ ๋ ค ์ฌํญ์ด ์ด๋ฅผ ๋ ์ง์ฐ์ํฌ ์ ์๋ ์ฌํญ์ ๋ํด ์๋ ค์ฃผ์ธ์.
๋ณ๊ฒฝ ์ฌํญ์ด ์์ต๋๊น?
์ด ํน์ ๊ธฐ๋ฅ์ด Angular ์ค๋ฌธ์กฐ์ฌ https://twitter.com/angular/status/1252646001162088448?s=20 ์ ์์๋ค๋ฉด ๊ฐ์ฅ ๋ง์ด ๋ํํ ํญ๋ชฉ์ด ๋ ๊ฒ์ ๋๋ค.
๊ฐ์ฅ ๋ง์ด ํฌํ๋ ๊ธฐ๋ฅ์ด ๋ง์ด ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ๋ฌผ๋ก @output
๋ฐ ๊ธฐํ ์ฌ๋ฌ ํญ๋ชฉ์ Observable์ ์ฌ์ฉํฉ๋๋ค. ๋ถํํ๋ ํ์ฌ ์๋๋ก๋ ๊ฒฐ์ฝ ๊ตฌํ๋์ง ์์ ๊ฒ์
๋๋ค.
์ด ํน์ ๊ธฐ๋ฅ์ด Angular ์ค๋ฌธ์กฐ์ฌ์ ์์๋ค๋ฉด ๊ฐ์ฅ ๋ง์ด ๋ํํ ํญ๋ชฉ์ผ ๊ฒ์ ๋๋ค.
์ข์ ์์ด๋์ด @princemaple!
์ด์์ ์ด์ง๋ ์์ง๋ง ์ค์ ๋ก ์ค๋ฌธ์กฐ์ฌ์ "์ถ๊ฐ ์๊ฒฌ" ์น์
(์ง๋ฌธ 2)์์ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๊ทธ๊ฒ์ด ๋งํ๋ ๊ณณ :
"How else should we improve Angular for you?"
๋ฐ๋ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ๊ธฐ๋ฅ์ ๊ด์ฌ์ด ์๋ ๋ชจ๋ ์ฌ๋์ "Issue #8785"๊ฐ ๊ตฌํ๋๊ณ ํด๊ฒฐ๋๋ ๊ฒ์ ๋ณด๋ ๋ฐ ๊ด์ฌ์ด ๋ง๋ค๋ ์ฌ์ค์ ์ค๋ฌธ์กฐ์ฌ์ ์๋ตํ๊ณ ๋ช ์์ ์ผ๋ก ์๋ ค์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
์ค๋ฌธ์กฐ์ฌ์ ๋ํ ์ง์ ๋งํฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
https://goo.gle/angular-survey-2020
ํฌ์ค๊ฐ ํจ๊ปํ๊ธธ! ๐
๋ ์ญ์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ ์์์ ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ณ ์ฌํ๊ณ ์์ผ๋ฉฐ ์์งํ ์ฌ๊ธฐ์์ ์ ์ํ๋ ์ผ๋ถ๋ ์ด๋ฌํ ํน์ ๋ฌธ์ ์ ์ ๊ทผํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ ๊ทธ ๊ธฐ์ฌ์ ๊ด๋ จํ์ฌ Angular ํ์๋ค๊ณผ ์ด์ผ๊ธฐ๋ฅผ ๋๋ด์ต๋๋ค.
์ด๊ฒ์ด ์ด์ Ivy์์ ๊ฐ๋ฅํ์ง ๋๊ตฐ๊ฐ ํ์ธํ ์ ์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ์๋ฅผ ๋ค์ด๋ณธ ์ฌ๋์ด ์์ต๋๊น?
์์ง ์๋ฌด ๋ง๋ ์์๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ์ฐพ์ ์ ์๋ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฒ์ ์ ๊ณตํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ์ด๊ฒ์ Ivy๋ก ๋ฏน์ค์ธ์ ๊ตฌํํ๋ ๊ฒ์ ๋ํ ์ผ๋ง ์ ์ ๊ธฐ์ฌ์ ๋๋ค: https://blog.nrwl.io/metaprogramming-higher-order-components -and-mixins-with-angular-ivy-75748fcbc310
๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๊ฒ์ด Angular์ ๋ด๋ถ๋ฅผ ํดํนํ๋ค๋ ์ธ์์ ์ฃผ์๊ณ , ์ฌ์ค ์ผ๋ฐ์ ์ธ ์ฌ์ฉ์ ์๋น๋ฅผ ์ํด ์ค๊ณ๋์ง ์์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ด ์์ ์ ์ํํ ์ ์๋๋ก ํ๋ ๊ธฐ์ ์ ์ธ ์ด์ ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์ด๋ป๊ฒ ๋ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ ์ด ์์ ์ ์ํํ ์ ์๋ ๋ฅ๋ ฅ์ด ์๋ค๋ฉด Angular๋ฅผ ์ฌ์ฉํ๋ ๋์ ์ผ์์ ๋น์ฝ์ ์ผ๋ก ํฅ์์ํฌ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
โ์ฐ๋ฆฌ๋ ์ง์ญ์ฌํ์ ํ๋ ฅํ๊ธฐ ์ํ ํฌ์๋ฅผ ๊ทน์ ์ผ๋ก ๋๋ ธ์ต๋๋ค. ์ง๋ 3์ฃผ ๋์ ๊ณต๊ฐ ๋ฌธ์ ์๊ฐ ํ๋ ์์ํฌ, ๋๊ตฌ ๋ฐ ๊ตฌ์ฑ ์์ ์ ๋ฐ์ ๊ฑธ์ณ 700๊ฐ ์ด์์ ๋ฌธ์ ๋ก ๊ฐ์ํ์ต๋๋ค. ์ฐ๋ฆฌ๋ 2,000๊ฐ ์ด์์ ๋ฌธ์ ๋ฅผ ๋ค๋ฃจ์๊ณ ์์ผ๋ก ๋ช ๋ฌ ๋์ ๋๊ท๋ชจ ํฌ์๋ฅผ ํ ๊ณํ์ด๋ฉฐ ์ปค๋ฎค๋ํฐ์ ํ๋ ฅํ์ฌ ๋ ๋ง์ ์ผ์ ํ ๊ฒ์ ๋๋ค.โ โ @StephenFluin
Angular 10 ๋ฐํ์์
๊ทธ๋์ ์ด๊ฒ์ด v11์์ ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์์ ์๋ฏธํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๐ค๐
๊ฐ์ฅ ๋ง์ด ์์ฒญ๋ ๊ธฐ๋ฅ ์ค ํ๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๋ณด๋ค "์ปค๋ฎค๋ํฐ์ ํ๋ ฅ"(๋ฐ ๋ฌ๋๊ธฐ)ํ๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์์ต๋๊น!? (์ด๊ฒ ๐)
๊ทธ๋ค์ ๋ง์ ๋ค์ด๋ผ!
๊ธฐ๋์น๋ฅผ ์ค์ ํ๊ธฐ ์ํด ๊ทํ๊ฐ ์๊ตฌํ๋ ๊ฒ์ ์ฌ์ํ ์์ ๋์ด ์๋๋ฉฐ ํ์ฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์ค์ ๋ก ์ด๋ฅผ ์ํด ์ค๊ณ๋์ง ์์์ต๋๋ค. ๋ฐ๋ผ์ ์ด์ ๊ฐ์ ๊ฒ์ ์ง์ํ๋ ค๋ฉด ๋ช ๊ฐ์ง ์ฃผ์ ์์ง๋์ด๋ง์ด ํ์ํฉ๋๋ค.
@mhevery ํ ํ๋ฆฟ์ ๋ถ๋ชจ์์ ์ ์ฉํ๋ ๋ค๋ฆ ๋ ๊น?
@k3nsei NgModule
๊ด์ ์์ ๋ณผ ํ์๊ฐ ์์ต๋๋ค. ์ค์ ๋ก ๋ชจ๋ ๊ตฌ์ฑ ์์์ ์ธํ๋ผ๋ฅผ ๋ง๋๋ ํต์ฌ ์์์
๋๋ค.
@mlc-mlapis @HostBinding ๋ฐ @HostListener๊ฐ ์์ผ๋ฏ๋ก @HostDirective ๊ฐ ํด๋น ๊ธฐ๋ฅ์ ์ข์ ์ ํ์ผ ์ ์์ต๋๋ค. Ivy api๊ฐ ๊ทธ๋ฌํ ๊ธฐ๋ฅ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค๋ ์ด์ผ๊ธฐ๋ฅผ ๋ณธ ์ ์ด ์์ต๋๋ค.
์ ์๊ฒ ์์ ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ ํฌ ๊ธฐ๋ฅ์ด ์๋ ํ์ฅ/ํน์ฑ์ ๊ฐ์ง ์ ์๋ ๋ ๋ง์ ๋ถ๋ฆฌ๋ ํด๋์ค๋ฅผ ๊ฐ์ง ์ ์๋ ๊ตฌ์ฑ API๋ฅผ ๊ฐ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด ์ ํ ๊ฐ๋ฅ, ํ์ฅ ๊ฐ๋ฅ/์ ์ ์ ์์ต๋๋ค.
@k3nsei ๊ทธ๋ด ์๋ ์์ง๋ง ๋๋ฌด ๋์ ์ด์ง ์์์ง ํ์คํ์ง ์์ ์๊ฒฉํ๊ฒ ์ ์ ์ธ ๊ตฌ์กฐ๋ณด๋ค ์ฑ๋ฅ์ด ๋จ์ด์ง๋๋ค.
"๊ธฐ๋๋ฅผ ์ค์ ํ๊ธฐ ์ํด ๋น์ ์ด ์๊ตฌํ๋ ๊ฒ์ ์ฌ์ํ ์์ ๋์ด ์๋๋ฉฐ ํ์ฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์ค์ ๋ก ์ด๋ฅผ ์ํด ์ค๊ณ๋์ง ์์์ต๋๋ค. ๋ฐ๋ผ์ ์ด์ ๊ฐ์ ๊ฒ์ ์ง์ํ๋ ค๋ฉด ์ผ๋ถ ์ฃผ์ ์์ง๋์ด๋ง์ด ํ์ํฉ๋๋ค." โ https://github.com/angular/angular/issues/8785#issuecomment -654391378
@mhevery์ ์ ์์ ์๋ตํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ ๋ ์ด๊ฒ์ด ๋งค์ฐ ํฐ ๋์ ์ด ๋ ๊ฒ์ด๋ผ๋ ์ฌ์ค์ ์ ํ ์์ด๋ฒ๋ฆฌ์ง ์์๋ค๋ ์ ์์ ์ปค๋ฎค๋ํฐ๋ฅผ ์ํด ๋งํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ ์ง ์์๋ค๋ฉด ์ง๊ธ์ฏค์ด๋ฉด ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ์ ๋๋ก(์ด๋ป๊ฒ๋ ) ๋ฌ์ฑํ ์ ์๋ ์ผ๋ถ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค์์ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. [์ ๊ฐ ์๊ธฐ๋ก๋ ์์ต๋๋ค.]
๋ํ, ๋งํ ํ์๋ ์์ด ์ฌ๊ธฐ์ ๊ธฐ์ฌํ๋ ๋ฐ ๋์์ด ๋ ์ ์๋ ๋ฎ์ ๋งค๋ฌ๋ฆฐ ๊ณผ์ผ(๋๋ ๊ธฐํ)์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ญ์์ค.
์ฐ๋ฆฌ๋ ์ง์ฌ์ผ๋ก ๊ฐ์ฌํ๊ณ ๊ทํ์ ์ง์งํ ์์ฌ ์ํต์ ์์คํ ์ฌ๊ธฐ๋ฉฐ ์ฐ๋ฆฌ๊ฐ ํ์๋กํ๋ ๊ฒ๊ณผ ํ์ค์ /์ค์ฉ์ ์ธ ๊ฒ์ ๋ํ ๋ํ์ ์ผ๋ถ๊ฐ ๊ณ์๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ด ์ดํด๋ Ivy๊ฐ ์ด์ ๋ณด๋ค ์ด๊ฒ์ ๋ ์ฝ๊ฒ ๋ง๋ ๋ค๋ ๊ฒ์ ๋๋ค.
@mhevery
@IgorMinar Ivy ์์ ์ ์ด๊ฒ์ ๋ ์คํ ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค. ๊ทธ๋ฌ๋ ์ ๊ณผ๊ฑฐ v6.
๋ด ์ดํด๋ Ivy๊ฐ ์ด์ ๋ณด๋ค ๋ ์ฝ๊ฒ ๋ง๋ ๋ค๋ ๊ฒ์ ๋๋ค.
๋์ ์๋ก์ด ์ดํด๋ "๋ ์ฝ๋ค"๋ ๊ฒ์ด ์ฌ์ ํ "์ฌ์"์ ์๋ฏธํ์ง๋ ์๋๋ค
๋์ ์๋ก์ด ์ดํด๋ "๋ ์ฝ๋ค"๋ ๊ฒ์ด ์ฌ์ ํ "์ฌ์"์ ์๋ฏธํ์ง๋ ์๋๋ค
Ivy: ๋น์ ์ด 2๋ ์ ๋ณด๋์ง๋ง ์ฌ์ ํ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ Angular ๋ฌธ์ ๋ฅผ ๋ค๋ฃจ์ง ์์ ๊ฒ์ ๋๋ค.
Ivy: ๋น์ ์ด 2๋ ์ ๋ณด๋์ง๋ง ์ฌ์ ํ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ Angular ๋ฌธ์ ๋ฅผ ๋ค๋ฃจ์ง ์์ ๊ฒ์ ๋๋ค.
@pauldraper ์ ์๊ฐ์๋ ์ด ํน์ ๋ฌธ์ ๊ฐ
๊ฐ์ธ์ ์ผ๋ก ์ ๋ ์คํ ์์ค์ผ ๋ฟ๋ง ์๋๋ผ ์ปค๋ฎค๋ํฐ(๋ฐ ์ฌ์ฉ์)๊ฐ ์ค์ ๋ก ์ํฅ์ ๋ฏธ์น๋ ๋ฐฉํฅ์ด ์๋ ํ๋ก์ ํธ๋ฅผ ๋ค๋ฅธ ๊ณณ์์ ์ฐพ์์ผ ํ ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@pauldraper ์ ์๊ฐ์๋ ์ด ํน์ ๋ฌธ์ ๊ฐ
@somombo ์ด ๋ฌธ์ ๊ฐ ๋ช ๋ ์ด ์ง๋ ํ์๋ ์ฌ์ ํ ์ด๋ ค ์๋ค๋ ์ฌ์ค์ ์ค๋งํ์ง๋ง, ๋๋ ๋น์ ์๊ฒ ๋์ํ ์ ์์ต๋๋ค. ๋ก๋๋งต์ ์ฒซ ๋ฒ์งธ ์์ ์ ๊ณต๊ฐ github ๋ฌธ์ ๋ฅผ ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋๋ค. ๋ก๋๋งต์ ๋ชจ๋ ๋์ดํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์๊ฒ ์ฃ ? ์ด ๋ฌธ์ ๋ ๋๋ถ๋ถ์ upvoted ์ค ํ๋ (๋๋ ๊ฐ์ฅ upvoted)์ ๋ด๊ฐ ๋ง์นจ๋ด ํด๊ฒฐ์ฃผ์ ๋ฐ๋๋๋ค.
๋ก๋๋งต์ ์ฒซ ๋ฒ์งธ ์์ ์ ๊ณต๊ฐ github ๋ฌธ์ ๋ฅผ ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋๋ค. ๋ก๋๋งต์ ๋ชจ๋ ๋์ดํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์๊ฒ ์ฃ ? ์ด ๋ฌธ์ ๋ ๊ฐ์ฅ ๋ง์ด ์ฐฌ์ฑ(๋๋ ๊ฐ์ฅ ๋ง์ด ์ฐฌ์ฑ)๋ ๋ฌธ์ ์ค ํ๋์ด๋ฉฐ ๋ง์นจ๋ด ํด๊ฒฐ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์๋์, ์ด๊ฒ์ ๋จ์ง ํฌ๋ง์ ์ธ ์๊ฐ์ ๋๋ค. https://github.com/angular/angular/issues/5689๋ฅผ ํตํด ์ฝ์ด๋ณด์ญ์์ค. ๊ทธ๋ค์ด "๊ฐ๋ ฅํ ํ์์ ํ์"์ ์ ์ธํ๊ณ ๊ฐ์ฅ ๋ง์ด ํฌํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ถ๋ค๋ ํ์๋ ์ ํ ์์ต๋๋ค. ๋ฏธ๋
@pauldraper ์ ์๊ฐ์๋ ์ด ํน์ ๋ฌธ์ ๊ฐ
@somombo ์ด ๋ฌธ์ ๊ฐ ๋ช ๋ ์ด ์ง๋ ํ์๋ ์ฌ์ ํ ์ด๋ ค ์๋ค๋ ์ฌ์ค์ ์ค๋งํ์ง๋ง, ๋๋ ๋น์ ์๊ฒ ๋์ํ ์ ์์ต๋๋ค. ๋ก๋๋งต์ ์ฒซ ๋ฒ์งธ ์์ ์ ๊ณต๊ฐ github ๋ฌธ์ ๋ฅผ ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋๋ค. ๋ก๋๋งต์ ๋ชจ๋ ๋์ดํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์๊ฒ ์ฃ ? ์ด ๋ฌธ์ ๋ ๋๋ถ๋ถ์ upvoted ์ค ํ๋ (๋๋ ๊ฐ์ฅ upvoted)์ ๋ด๊ฐ ๋ง์นจ๋ด ํด๊ฒฐ์ฃผ์ ๋ฐ๋๋๋ค.
๋ชจ๋ ๊ฐ์ .. ๋๋ ๊ธฐ๋ค๋ฆผ์ ๋๋์ต๋๋ค.. ์ด ๋ฌธ์ ๋ ๋ง ๊ทธ๋๋ก ์ ์๊ฒ ํฐ ๋ฐฉํด ์์์์ต๋๋ค. ๊ทธ๋์ ์์ง ์์ ์ ์๋ ๊ฒ ๊ฐ๋ค๋ ์ฌ์ค์ ๊ฐ์ธ์ ์ผ๋ก ์์ผ๋ก ๋์๊ฐ์ผ ํ ๋๋ผ๋ ๋ป์ด๊ธฐ๋ ํ๋ค. ๋ค๋ฅธ ๋ชจ๋ ์ฌ๋๋ค์๊ฒ ํ์ด์ ๋น๋๋ค.
"์ง์๋ฌธ์ ์ง์๋ฌธ ์ถ๊ฐ ์ง์"์ผ๋ก ์ด๋ฆ์ด ๋ฐ๋์์ผ๋ฉด ํฉ๋๋ค. ์ด๋ฆ์ด ํผ๋์ค๋ฌ์ธ ์ ์์ง๋ง ์ด ๊ธฐ๋ฅ์ด ๊ตฌ์ฑ ์์์ ๊ตญํ๋์ง ์๊ณ ์ง์๋ฌธ์์ ์๋ํ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ธฐ๋ฅ์ ๋ํ ๋ค๋ฅธ ์ด๋ฆ์ "๋ฌต์์ ์ง์๋ฌธ" ๋๋ "์ฒจ๋ถ ์ง์๋ฌธ"์ผ ์ ์์ต๋๋ค. ์ฆ, ํ ํ๋ฆฟ์์ ์ง์ ๋ ๊ตฌ์ฑ ์์ ๋๋ ์ง์๋ฌธ์ ์ฌ์ฉํ ๋ ํธ์คํธ ์์์ ๋ํ ์์์ /์ฒจ๋ถ ์ง์๋ฌธ์ ๊ฐ์ ธ์ต๋๋ค.
๋๋ ์ด๊ฒ์ ์ฌ๋ฌ ๋ฒ ์ํ๋๋ฐ, ์ฃผ๋ก ํฉ์ฑ์ด ์์์ ๋นํด Angular์์ ์ฌ์ฌ์ฉ์ ๋ ๊นจ๋ํ ํํ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ค์ค ์์์ด ์๊ณ ์์ฑ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํด์ผ ํ๊ณ ์ผ๋ถ Angular ๊ธฐ๋ฅ์ ์์๋ ๋ ์๋ํ๊ณ ๋๋จธ์ง๋ ๊ฐ ๋ฆฌํ ํด๋์ค์์ "๋ค์ ์ฐ๊ฒฐ"ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์์์ด ๋ณต์กํ ์ ์์ต๋๋ค.
์ง์๋ฌธ ์ธ์คํด์คํ์ ๊ตฌ์ฑ ์์ ๋ก์ปฌ ๋๋ ์ง์๋ฌธ ๋ก์ปฌ ํ์์ฒ๋ผ ์๋ํ๋ "์์์ /์ฒจ๋ถ๋ ์ง์๋ฌธ"์ ์์ํฉ๋๋ค. ๋ฐ๋ผ์ ์ง์๋ฌธ ์ ํ๊ธฐ๊ฐ ํ ํ๋ฆฟ ๋งํฌ์ ์ ์กด์ฌํ์ง ์์๋ ํธ์คํธ ์์์์ ์ง์๋ฌธ์ด ์ธ์คํด์คํ๋ฉ๋๋ค.
๋ค์์ ์์ ๋๋ค.
@Directive({
selector: 'app-popup',
attachDirectives: [
FocusAreaDirective
]
})
export class PopupDirective {
// Attached directives can be injected, just like template-declared directives today
constructor(public focusArea: FocusAreaDirective) {
}
}
์ฐ๊ฒฐ๋ ๋๋ ํฐ๋ธ์ @Input()
๋ฐ @Output()
์์ฑ์ ํ
ํ๋ฆฟ์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ฐ๊ฒฐ๋ ๋๋ ํฐ๋ธ์ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋๋ ํธ์คํธ ๊ตฌ์ฑ ์์ ์๋ช
์ฃผ๊ธฐ์ ์ผ๋ถ๋ก ํธ์ถ๋์ด์ผ ํฉ๋๋ค. ์ฒจ๋ถ๋ ์ง์๋ฌธ์ ํธ์คํธ ์์์ ๋ฐ์ธ๋ฉํ ์๋ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋๋ ํ
ํ๋ฆฟ ์ ์ธ ์ง์๋ฌธ๊ณผ ๋๊ฐ์ด ์๋ํ์ง๋ง ํ
ํ๋ฆฟ์์ ์ ์ธํ ํ์๋ ์์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ Angular์ ์๋นํ ์ด์ ์ ์ ๊ณตํ์ฌ ์ง์๋ฌธ ๊ตฌ์ฑ์ ํตํด ๋ ๊นจ๋ํ๊ณ ๋จ์ํ ๊ตฌ์ฑ ์์ ์ํคํ ์ฒ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ค๋๋ ๋น์ทํ ํํ์ ์ง์๋ฌธ ์ฌ์ฌ์ฉ์ ์ํ๋ ๊ฒฝ์ฐ ๋ ๊ฐ์ง ์ ํ์ด ์์ต๋๋ค.
๋ค์ ๋งํด, ๊ธฐ๋ฅ์ด ์์ผ๋ฉด ๊นจ๋ํ+๋จ์ํ ๊ตฌ์ฑ ์์ ์ฌ์ฉ๊ณผ ๊นจ๋ํ+๋จ์ํ ๊ตฌ์ฑ ์์ ์์ฑ ์ฌ์ด์ ๋ถํ์ํ ์ ์ถฉ์ด ์๊ธฐ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
@johncrim
์ค์ ์ฌ๋ก์์ ์ฌ์ฉ์ ์ง์ ์ง์๋ฌธ์๋ ์
๋ ฅ์ด ์๊ณ ์ด๋ฅผ ๋ณํํ๊ณ ์ฐ๊ฒฐ๋ ์ง์๋ฌธ์ ์
๋ ฅ์ผ๋ก ์ ๋ฌํ๋ ค๊ณ ํฉ๋๋ค. ์๋ง๋ ์ด๊ฒ์ ์ง์๋ฌธ ๋ฐ์ฝ๋ ์ดํฐ ์ต์
์ host
์์ฑ๊ณผ ์ ์ฌํ ๊ตฌ๋ฌธ์ผ๋ก ์ํํ ์ ์์ต๋๋ค.
@amakhrov : ์ข์ ์ง์ - ๋ช ํ์ฑ์ ์ํด ์์ ์์ ์ ๋ ฅ์ ์ ์ธํ์ต๋๋ค. ์ด๊ฒ์ด ํ์ํ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ ์ฒจ๋ถ๋ ์ง์๋ฌธ์ ๋ํ ์ ๋ ฅ(๋๋ ์ถ๋ ฅ)์ ๋ณํํ ํ์๊ฐ ์์ต๋๋ค. (์ด์์ ์ผ๋ก๋) ๊ตฌ์ฑ ๊ฐ๋ฅํ ๋จ์๋ก ์๋ํ๊ณ ํด๋น ์ ๋ ฅ(๋๋ ์ถ๋ ฅ) ๊ฐ์ ํ ํ๋ฆฟ์์ ๋ฐ์ธ๋ฉ๋ ์ ์์ต๋๋ค. ๋ถ๋ชจ ์ง์๋ฌธ(๋๋ ๊ตฌ์ฑ ์์)์ ์ฌ์ฉํฉ๋๋ค.
๋ช ๋ช ์ถฉ๋ ๋๋ ๋ช ๋ช ๋ช ํ์ฑ ๋ฌธ์ (๊ตฌ์ฑ์ ๋ํ ์ง์๋ฌธ์ ์ค๊ณํ ๋ ํผํ๋ ค๊ณ ํจ)๊ฐ ์๊ฑฐ๋ ์ ๋ ฅ ๋๋ ์ถ๋ ฅ์ ๋ณํํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ถ๋ชจ์ ์ฒจ๋ถ๋ ์ง์๋ฌธ์ ์ฝ์ ํ์ฌ ๋งค์ฐ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ง์๋ฌธ์ ๋ง๋ค๊ณ ์ฐ๊ฒฐ๋ ์ง์๋ฌธ์ ์์ํ๋ ๋ถ๋ชจ์์ ์ ์ ๋ ฅ ๋๋ ์ถ๋ ฅ ์์ฑ์ ๋ง๋ญ๋๋ค.
์ ์ ํฉ๋๋ค.
์ด ๋ฌธ์ ๋ ์ด์ ๊ณต์ ๋ก๋๋งต์ "๋ฏธ๋" ์น์
์ ๋์ด๋ฉ๋๋ค. https://angular.io/guide/roadmap#support -adding-directives-to-host-elements ์ฐธ์กฐ
ํธ์คํธ ์์์ ์ง์๋ฌธ ์ถ๊ฐ ์ง์
์ค๋ ๊ธฐ๋ฅ ์์ฒญ์ ํธ์คํธ ์์์ ์ง์๋ฌธ์ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค. ์ด ๊ธฐ๋ฅ์ ํตํด ๊ฐ๋ฐ์๋ ์์์ ์ฌ์ฉํ์ง ์๊ณ ์ถ๊ฐ ๋์์ผ๋ก ์์ ์ ๊ตฌ์ฑ ์์๋ฅผ ๋ณด๊ฐํ ์ ์์ต๋๋ค. ์ด ํ๋ก์ ํธ๋ API ์ ์, ์๋ฏธ๋ก ๋ฐ ๊ตฌํ ์ธก๋ฉด์์ ์๋นํ ๋ ธ๋ ฅ์ด ํ์ํฉ๋๋ค.
์ด์ ์์ผ ์์์ฐจ๋ ค์ ์ธ์ ์ถ๊ฐ๋์๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ข์ ์์์ด๊ณ ์๋ฏธ์๊ณ ๋ ๋ ํ ๋ชธ์ง์ด๋ผ๋ ์ ์ ์ธ์ ํฉ๋๋ค. ๊ณ์ํด์ ์๊ฐ๋ฝ์ง์ ํ๊ฒ ๋ฉ๋๋ค.
์ฌ๋ ค์ฃผ์ ํ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ๐๐พ
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@IgorMinar Ivy ์์ ์ ์ด๊ฒ์ ๋ ์คํ ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค. ๊ทธ๋ฌ๋ ์ ๊ณผ๊ฑฐ v6.