Angular: ์ œ์•ˆ: ๊ตฌ์„ฑ ์š”์†Œ ์„ ์–ธ์—์„œ ํ˜ธ์ŠคํŠธ ์š”์†Œ์— ์ง€์‹œ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2016๋…„ 05์›” 23์ผ  ยท  114์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: angular/angular

์ €๋Š” Angular 2๋ฅผ ํŒŒํ—ค์ณค๊ณ  ํŠน์ • ์ข…๋ฅ˜์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ž ์žฌ์ ์ธ ์žฅ์• ๋ฌผ์— ๋ถ€๋”ช์ณค์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์ œ์—๋Š” ๋ฒ„ํŠผ ๊ตฌ์„ฑ ์š”์†Œ์™€ ํ„ฐ์น˜ ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๋Š” ์ง€์‹œ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ๋™์ผํ•œ ํ„ฐ์น˜ ๋™์ž‘์„ ์ƒ์†ํ•˜๋Š” ๋ฒ„ํŠผ ์™ธ์—๋„ ๋งŽ์€ ๋‹ค๋ฅธ ๊ฐœ์ฒด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด ์˜ต์…˜์„ ํƒ์ƒ‰ํ–ˆ๊ณ , ๋‚˜๋Š” ๊ธธ์„ ์žƒ์—ˆ๋‹ค:

  • TouchClass๋ฅผ ์ง์ ‘ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. typescript๊ฐ€ ๋‹ค์ค‘ ํด๋ž˜์Šค ์ƒ์†์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ์ด์ƒ์ ์ด์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์†Œ๋น„์ž๊ฐ€ ์ž์‹ ์˜ ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋™์ž‘์„ ๋…ธ์ถœํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
  • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๊ฐ€์งœ ๋‹ค์ค‘ ํด๋ž˜์Šค ์ƒ์†. ์ด๊ฒƒ์€ ํ•ดํ‚น์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ ํ˜ผํ•ฉํ•˜๋ ค๋Š” ๋ชจ๋“  ํด๋ž˜์Šค์—์„œ shim API๋ฅผ ๋‹ค์‹œ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. https://www.stevefenton.co.uk/2014/02/TypeScript-Mixins-Part-One/
  • ๊ตฌ์„ฑ ์š”์†Œ ์ƒ์„ฑ์ž์˜ elementRef.nativeElement์—์„œ ์ง์ ‘ ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ๋„์šฐ๋ฏธ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์›Œ์ปค์—์„œ ์‹คํ–‰ํ•  ๋•Œ nativeElement๊ฐ€ null์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋ฌธ์„œ์— ๋ช…์‹œ๋˜์–ด ์žˆ๊ณ  ๊ทธ ๊ธฐ๋Šฅ์ด ์ œ๊ฐ€ ๊ฐ€์žฅ ๊ธฐ๋Œ€ํ•˜๋Š” ๋ถ€๋ถ„์ด๊ธฐ ๋•Œ๋ฌธ์— ์ €๋Š” ์ •๋ง๋กœ ์ด๊ฒƒ์„ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋„ˆ๋ฌด ๊นŠ์ด ๋“ค์–ด๊ฐ€์ง€ ์•Š๊ณ  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๊ฐ€ ๋ฉ‹์ง€๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค!. ๋‚ด๊ฐ€ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.

core directive matching host and host bindings feature

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@IgorMinar Ivy ์ž‘์—…์€ ์ด๊ฒƒ์„ ๋” ์‹คํ˜„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ ๊ณผ๊ฑฐ v6.

๋ชจ๋“  114 ๋Œ“๊ธ€

์ €๋Š” ํ˜„์žฌ ๋Œ€๊ทœ๋ชจ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ฐœ๋ฐœ ์ค‘์ด๋ฏ€๋กœ ๋ชจ๋“  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> 

... ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅธ ์ด์œ ๋กœ ์–ผ๋งˆ ์ „์— ๋งŒ๋“ค์–ด์ง„ ๋˜ ๋‹ค๋ฅธ ๋ณ„๋„์˜ ์ œ์•ˆ๊ณผ ์ž˜ ์–ด์šธ๋ฆฝ๋‹ˆ๋‹ค.

https://github.com/angular/angular/issues/7297 ์ฐธ์กฐ

ํ˜„์žฌ ๋ถ€๋ชจ ๊ตฌ์„ฑ ์š”์†Œ์— ์ง€์‹œ๋ฌธ์„ ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ @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 ๋ฐ”์ธ๋”ฉ์„ ๋„์ž…ํ•˜๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Angular๊ฐ€ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ๊ทธ๋ž˜ํ”„์˜ ์ฃผ๊ธฐ๋กœ ์ด์–ด์ง€๋ฏ€๋กœ
    ์˜ค๋ž˜๋œ ๊ฐ’์œผ๋กœ ์ธํ•ด ๋””๋ฒ„๊ทธํ•˜๊ธฐ ์–ด๋ ค์šด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. / "๊ฒ€์‚ฌ ํ›„ ํ‘œํ˜„์‹์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค." ์˜ค๋ฅ˜.
  • ์„œ๋กœ๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ์ง€์‹œ๋ฌธ์— ๋น„ํ•ด ์ถ”๊ฐ€ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    ๊ทธ๋ฆฌ๊ณ  ์ง์ ‘ ์†Œํ†ตํ•ฉ๋‹ˆ๋‹ค.

์ œ์•ˆ์˜ ์˜ต์…˜ 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๊ฐ€ ์‰ฌ์›Œ์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜์žˆ๋Š” ํ•œ ๊ทธ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ?

@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

์ง€๊ธˆ๊นŒ์ง€ ๋‚ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋ชจ๋‘ ๋‹จ์ ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  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();
  }
  ...
}
  1. ์ตœ์ƒ์œ„ ng ํ…œํ”Œ๋ฆฟ ๋‚ด ๊ตฌ์„ฑ ์š”์†Œ ํ…œํ”Œ๋ฆฟ์˜ ๋ชจ๋“  ๊ฒƒ์„ ๋ž˜ํผ,
    <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์— ์ƒ๋‹นํ•œ ์ด์ ์„ ์ œ๊ณตํ•˜์—ฌ ์ง€์‹œ๋ฌธ ๊ตฌ์„ฑ์„ ํ†ตํ•ด ๋” ๊นจ๋—ํ•˜๊ณ  ๋‹จ์ˆœํ•œ ๊ตฌ์„ฑ ์š”์†Œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋Š˜๋‚  ๋น„์Šทํ•œ ํ˜•ํƒœ์˜ ์ง€์‹œ๋ฌธ ์žฌ์‚ฌ์šฉ์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋‘ ๊ฐ€์ง€ ์„ ํƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ…œํ”Œ๋ฆฟ ๋งˆํฌ์—…์—์„œ ๊ด€๋ จ ์ง€์‹œ๋ฌธ ์„ธํŠธ๋ฅผ ํ•ญ์ƒ ํ•จ๊ป˜ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž์— ํ•„์š”ํ•œ ์ง€์‹œ๋ฌธ์ด ์—†์œผ๋ฉด ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๋˜์ง‘๋‹ˆ๋‹ค. ํ•„์ˆ˜ ์ง€์‹œ๋ฌธ์ด ๋™์ผํ•œ ์š”์†Œ์— ์„ ์–ธ๋˜๋„๋ก ์š”๊ตฌํ•  ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ…œํ”Œ๋ฆฟ ์ž‘์„ฑ ๋ฐ ๋ฌธ์„œํ™” ๊ด€์ ์—์„œ ์ง€์ €๋ถ„ํ•˜๊ณ  ์ค‘๋ณต์œผ๋กœ ์ธํ•ด ๊ฐ•๋ ฅํ•œ API ๋˜๋Š” ๊ณ„์•ฝ์ด ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋”์ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜ธ์ŠคํŠธ ์ง€์‹œ๋ฌธ ๋‚ด์—์„œ ์—ฐ๊ฒฐ๋œ ์ง€์‹œ๋ฌธ์„ ์ˆ˜๋™์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ  ์ƒ์„ฑ์ž ๋งค๊ฐœ๋ณ€์ˆ˜, @Input/ @Output ์†์„ฑ, ํ˜ธ์ŠคํŠธ ๋ฐ”์ธ๋”ฉ ๋ฐ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ๋‚ด๋ถ€ ์ง€์‹œ๋ฌธ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ตฌ์„ฑ ์š”์†Œ ์ž‘์„ฑ์ž์—๊ฒŒ ๊นจ์ง€๊ธฐ ์‰ฌ์šด ์—‰๋ง์ด์ง€๋งŒ ๊ด€๋ จ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ฐ„๋‹จํ•œ ์ง‘ํ•ฉ์ด ์ฃผ์–ด์ง€๋ฉด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ ์ž‘์„ฑ์— ํ›จ์”ฌ ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•ด, ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฉด ๊นจ๋—ํ•œ+๋‹จ์ˆœํ•œ ๊ตฌ์„ฑ ์š”์†Œ ์‚ฌ์šฉ๊ณผ ๊นจ๋—ํ•œ+๋‹จ์ˆœํ•œ ๊ตฌ์„ฑ ์š”์†Œ ์ž‘์„ฑ ์‚ฌ์ด์— ๋ถˆํ•„์š”ํ•œ ์ ˆ์ถฉ์ด ์ƒ๊ธฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@johncrim
์‹ค์ œ ์‚ฌ๋ก€์—์„œ ์‚ฌ์šฉ์ž ์ง€์ • ์ง€์‹œ๋ฌธ์—๋Š” ์ž…๋ ฅ์ด ์žˆ๊ณ  ์ด๋ฅผ ๋ณ€ํ™˜ํ•˜๊ณ  ์—ฐ๊ฒฐ๋œ ์ง€์‹œ๋ฌธ์— ์ž…๋ ฅ์œผ๋กœ ์ „๋‹ฌํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด๊ฒƒ์€ ์ง€์‹œ๋ฌธ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์˜ต์…˜์˜ host ์†์„ฑ๊ณผ ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@amakhrov : ์ข‹์€ ์ง€์  - ๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด ์˜ˆ์ œ์—์„œ ์ž…๋ ฅ์„ ์ œ์™ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ•„์š”ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์— ์ฒจ๋ถ€๋œ ์ง€์‹œ๋ฌธ์— ๋Œ€ํ•œ ์ž…๋ ฅ(๋˜๋Š” ์ถœ๋ ฅ)์„ ๋ณ€ํ™˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. (์ด์ƒ์ ์œผ๋กœ๋Š”) ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ๋‹จ์œ„๋กœ ์ž‘๋™ํ•˜๊ณ  ํ•ด๋‹น ์ž…๋ ฅ(๋˜๋Š” ์ถœ๋ ฅ) ๊ฐ’์€ ํ…œํ”Œ๋ฆฟ์—์„œ ๋ฐ”์ธ๋”ฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ€๋ชจ ์ง€์‹œ๋ฌธ(๋˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ช…๋ช… ์ถฉ๋Œ ๋˜๋Š” ๋ช…๋ช… ๋ช…ํ™•์„ฑ ๋ฌธ์ œ(๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์ง€์‹œ๋ฌธ์„ ์„ค๊ณ„ํ•  ๋•Œ ํ”ผํ•˜๋ ค๊ณ  ํ•จ)๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์ž…๋ ฅ ๋˜๋Š” ์ถœ๋ ฅ์„ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ถ€๋ชจ์— ์ฒจ๋ถ€๋œ ์ง€์‹œ๋ฌธ์„ ์‚ฝ์ž…ํ•˜์—ฌ ๋งค์šฐ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€์‹œ๋ฌธ์„ ๋งŒ๋“ค๊ณ  ์—ฐ๊ฒฐ๋œ ์ง€์‹œ๋ฌธ์— ์œ„์ž„ํ•˜๋Š” ๋ถ€๋ชจ์—์„œ ์ƒˆ ์ž…๋ ฅ ๋˜๋Š” ์ถœ๋ ฅ ์†์„ฑ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ •์ •ํ•ฉ๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ๋Š” ์ด์ œ ๊ณต์‹ ๋กœ๋“œ๋งต์˜ "๋ฏธ๋ž˜" ์„น์…˜์— ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค. https://angular.io/guide/roadmap#support -adding-directives-to-host-elements ์ฐธ์กฐ

ํ˜ธ์ŠคํŠธ ์š”์†Œ์— ์ง€์‹œ๋ฌธ ์ถ”๊ฐ€ ์ง€์›

์˜ค๋žœ ๊ธฐ๋Šฅ ์š”์ฒญ์€ ํ˜ธ์ŠคํŠธ ์š”์†Œ์— ์ง€์‹œ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์ƒ์†์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ถ”๊ฐ€ ๋™์ž‘์œผ๋กœ ์ž์‹ ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ณด๊ฐ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” API ์ •์˜, ์˜๋ฏธ๋ก  ๋ฐ ๊ตฌํ˜„ ์ธก๋ฉด์—์„œ ์ƒ๋‹นํ•œ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ์„œ์•ผ ์•Œ์•„์ฐจ๋ ค์„œ ์–ธ์ œ ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ข‹์€ ์†Œ์‹์ด๊ณ  ์˜๋ฏธ์žˆ๊ณ  ๋“ ๋“ ํ•œ ๋ชธ์ง“์ด๋ผ๋Š” ์ ์€ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์†ํ•ด์„œ ์†๊ฐ€๋ฝ์งˆ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์˜ฌ๋ ค์ฃผ์‹  ํŒ€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๐Ÿ™๐Ÿพ

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰