Angular: ์ง€์—ฐ ๋กœ๋“œ๋œ NgModule์˜ ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋ชจ๋“ˆ ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 02์›” 06์ผ  ยท  122์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: angular/angular

์ œ์ถœ ์ค‘์ž…๋‹ˆ๋‹ค ... ( "x"๋กœ ํ•˜๋‚˜ ์„ ํƒ)

[ ] bug report => search github for a similar issue or PR before submitting
[X] feature request
[ ] support request => Please do not submit support request here, instead see https://github.com/angular/angular/blob/master/CONTRIBUTING.md#question

@DzmitryShylovich๊ฐ€ ์š”์ฒญํ•œ # 12275 ์— ๋Œ€ํ•œ ํ›„์† ๋ฌธ์ œ

ํ˜„์žฌ ํ–‰๋™
์ง€์—ฐ ๋กœ๋“œ๋œ NgModule์˜ entryComponents ๋Š” ComponentFactoryResolver ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: No component factory found for {{entryComponent}}

์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™
entryComponents ๋Š” ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ง€์นจ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ์ตœ์†Œํ•œ์œผ๋กœ ์žฌํ˜„
http://plnkr.co/edit/9euisYeSNbEFrfzOhhzf?p=preview

๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ๊ฐ„๋‹จํ•œ ์„ค์ •์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. Main ๊ตฌ์„ฑ ์š”์†Œ๋Š” Type ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. EntryComponent ๋Š” Page1Module entryComponent ๋กœ ์„ ์–ธ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Page1Module ๋ฅผ ๋กœ๋“œํ•œ ํ›„ ComponentFactoryResolver EntryComponent ๋ฅผ ๋ Œ๋”๋งํ•˜๋ ค๊ณ  ํ•˜๋ฉด No component factory found for EntryComponent ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํ–‰๋™์„ ๋ฐ”๊พธ๋Š” ๋™๊ธฐ/์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
๋ฃจํŠธ ์ˆ˜์ค€์—์„œ ์ž์‹ ๋ชจ๋“ˆ์˜ entryComponents ๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ๊ฒƒ ์œ„์— ๋ Œ๋”๋ง๋  ๋ชจ๋‹ฌ
  • ์•Œ๋ฆผ
  • ๋“ฑ.

๊ท€ํ•˜์˜ ํ™˜๊ฒฝ์— ๋Œ€ํ•ด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.
์šฐ๋ฆฌ๋Š” ํ˜„์žฌ Angular 2.1.1์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ด๊ฒƒ์€ ์ตœ์‹  ๋ฒ„์ „์˜ Angular(2.4.6)์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค(plnkr ์ฐธ์กฐ).

  • ์–ธ์–ด: TypeScript ^2.0.0
core feature

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

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ด ๋ฌธ์ œ๋ฅผ ๊ธฐ๋Šฅ ์š”์ฒญ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

IMO์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ DOM์„ ๋”ฐ๋ผ ์ˆ˜๋™์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋Œ€์‹  Angular ์ž์ฒด์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์•ฝ๊ฐ„์˜ ์กฐ์‚ฌ ํ›„์— ๋‚˜๋Š” ๋‹น์‹ ์ด ์„ค๊ณ„ํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค.
ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ง€์—ฐ ๋กœ๋“œ๋œ ๋ชจ๋“ˆ์˜ ๊ณต๊ธ‰์ž์™€ ๋™์ผํ•œ ๊ทœ์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. https://angular.io/docs/ts/latest/cookbook/ngmodule-faq.html#! #q-lazy-loaded-module-provider-visibility
์ง€์—ฐ ๋กœ๋“œ๋œ ๋ชจ๋“ˆ ๋‚ด์—์„œ๋งŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์˜๋„๋œ ๋™์ž‘์ด๋ผ๋ฉด ์œ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ ๊ฐ™์€ ํŠน์ • ์ž‘์—…์„ ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋ฉ”์ธ ๋ชจ๋“ˆ์„ ํญํŒŒ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ ์ ˆํ•œ ํ•ด๊ฒฐ์ฑ…์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.

MainComponent ์—์„œ ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด AppModule ์—์„œ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‹น์‹ ์˜ ์†”๋ฃจ์…˜์€ ์‹ค์ œ๋กœ ๋ชจ๋“  ๊ฒƒ์„ ๋ฉ”์ธ ๋ชจ๋“ˆ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ?

IMO๋Š” ๊ธฐ๋Šฅ ๋ธ”๋ก์„ ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ๋กœ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” Angular์˜ ๋ชจ๋“ˆ ๊ฐœ๋…์„ ์™„์ „ํžˆ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋‹ฌ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ง€์—ฐ ๋กœ๋“œ ์•„ํ‚คํ…์ฒ˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์žฌ๋ฃŒ์˜ https://material.angular.io/components/component/dialog ์™€ ์œ ์‚ฌํ•œ API๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด ์ž‘๋™ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์™€์šฐ, ๊ทธ๋ž˜์„œ Angular Material์ด ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ DOM ์ฝ˜ํ…์ธ ๋ฅผ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค: https://github.com/angular/material2/blob/master/src/lib/core/portal/dom-portal-host.ts#L30 -L55

์ด๊ฒƒ์ด Angular์—์„œ ์ด๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ Angular๋ฅผ ๋ฒ„๋ฆฌ๊ณ  JQuery๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•˜์ง€๋งŒ ์ €๋Š” ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ง„์ง€ํ•˜๊ฒŒ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ชจ๋‹ฌ ๋ฐ ์ง€์—ฐ ๋กœ๋”ฉ์— ๋Œ€ํ•œ ์ตœ์„ ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์–ด์จŒ๋“  plunkr์—์„œ๋Š” ์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•˜๋ฉฐ ์—ฌ๊ธฐ์—๋Š” ๊ฐ๋„ ๋ฒ„๊ทธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๋ชจ๋‹ฌ์— ๋Œ€ํ•œ ๋…ผ์˜๋ฅผ ์œ„ํ•ด์„œ๋Š” gitter ๋ฐ stackoverflow์™€ ๊ฐ™์€ ์ง€์› ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ด ๋ฌธ์ œ๋ฅผ ๊ธฐ๋Šฅ ์š”์ฒญ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

IMO์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ DOM์„ ๋”ฐ๋ผ ์ˆ˜๋™์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋Œ€์‹  Angular ์ž์ฒด์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋Š˜ ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง€์—ฐ ๋กœ๋“œ ๋ชจ๋“ˆ์— ์ •์˜๋œ ๋ชจ๋‹ฌ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์•ฑ ๋ชจ๋‹ฌ ์„œ๋น„์Šค์—์„œ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค( entryComponents ์‚ฌ์šฉ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ฐพ์„ ์ˆ˜ ์—†์Œ). ๊ฒŒ์œผ๋ฅธ ๋ชจ๋“ˆ ๊ตฌ์กฐ์™€ ์‚ฌ์šฉ ๋กœ์ง์„ ๊นจ๋œจ๋ฆฌ๋Š” ๋ฉ”์ธ ๋ฒˆ๋“ค๋กœ ๊ฐ•์ œ ์ด๋™:ํ˜ผ๋ž€:

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค ... ๊ฒŒ์œผ๋ฅธ ๋ชจ๋“ˆ ๋…ผ๋ฆฌ๋ฅผ ๊นจ์ง€ ์•Š๊ณ  lazyLoaded ๋ชจ๋“ˆ์—์„œ entryComponents๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด LazyLoaded ๋ชจ๋“ˆ์€ ๋‚ด AppModule์— ์„ ์–ธ๋œ entryComponent์— ์ข…์†๋ฉ๋‹ˆ๋‹ค.

์ด ๋™์ผํ•œ ๋ฌธ์ œ์— ๋ถ€๋”ช์ณค์ง€๋งŒ ng-bootstrap ๋ชจ๋‹ฌ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณธ ํ›„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๋ณธ์งˆ์ ์œผ๋กœ ๋ฌธ์ œ(๋‚ด ์ดํ•ด๊ฐ€ ์ž˜๋ชป๋œ ๊ฒฝ์šฐ ์ˆ˜์ •ํ•ด ์ฃผ์„ธ์š”)๋Š” ์•ฑ์ด ๋ถ€ํŠธ์ŠคํŠธ๋žฉ๋  ๋•Œ ์ดˆ๊ธฐ ์ธ์ ํ„ฐ์— ๊ฒŒ์œผ๋ฅธ ๋ชจ๋“ˆ์ด ํฌํ•จ๋˜์ง€ ์•Š๊ณ  ์ดˆ๊ธฐ ์ธ์ ํ„ฐ๊ฐ€ ์„ค์ •๋˜๋ฉด ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด OP์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ์ง€์—ฐ ๋ชจ๋“ˆ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋กœ๋“œ๋˜๋ฉด ์ง€์—ฐ ๋ชจ๋“ˆ์—์„œ ์„ ์–ธํ•˜๊ฑฐ๋‚˜ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ํฌํ•จ๋œ ์ž์ฒด ์ธ์ ํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ฆ‰, ๋™์  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ์˜ฌ๋ฐ”๋ฅธ injector ๋ฐ componentFactoryResolver ์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์žˆ๋Š” ํ•œ ์‹ค์ œ๋กœ ์ง€์—ฐ ๋กœ๋“œ๋œ ๋ชจ๋“ˆ ์™ธ๋ถ€์—์„œ entryComponent ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ํ•œ ๊ฒƒ์€ ๋‚ด๊ฐ€ ๋งŒ๋“ค๊ณ  ์‹ถ์€ ๋™์  ์ปดํฌ๋„ŒํŠธ์˜ injector ์™€ componentFactoryResolver ๋ฅผ ์ €์žฅํ•˜๋Š” ์‹ฑ๊ธ€ํ†ค ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์„œ๋น„์Šค๋Š” ๊ฒŒ์œผ๋ฅธ ๋ชจ๋“ˆ ์™ธ๋ถ€์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋™์ ์œผ๋กœ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ์ด ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ•„์š”ํ•œ ๊ฒƒ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ๋Š” ๊ฒŒ์œผ๋ฅธ ๋ชจ๋“ˆ ์™ธ๋ถ€์—์„œ ๋™์  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ชจ๋“  ์œ„์น˜์— ์žˆ์Šต๋‹ˆ๋‹ค.

@ViewChild('parent', {read: ViewContainerRef}) parent: ViewContainerRef;
  private componentRef: ComponentRef<any>;
...
const childComponent = this.componentFactoryResolver.resolveComponentFactory(yourComponentRef);
this.refInjector = ReflectiveInjector.resolveAndCreate([{provide: yourComponentRef, useValue: yourComponentRef}], this.injector);
this.componentRef = this.parent.createComponent(childComponent, 0, this.refInjector);

```html

Then in your parent component for your entryComponent you'll inject `injector` and `componentFactoryResolver` and set their values in the shared service:
```js
constructor(private componentFactoryResolver: ComponentFactoryResolver, private injector: Injector) {}

์ด๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํŽธ์ง‘ ๋‚ด๊ฐ€ Angular 2.4.9๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค.

@jmcclanahan ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์„œ๋น„์Šค์˜ ๋ชจ์–‘๊ณผ ์„ค์ • ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ข€ ๋” ๋ง์”€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋น„์Šทํ•œ ๋ฌธ์ œ๋กœ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ง€์—ฐ ๋กœ๋“œ๋œ ๋ชจ๋“ˆ์—์„œ ๋‹ค๋ฅธ ์ง€์—ฐ ๋กœ๋“œ๋œ ๋ชจ๋“ˆ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  (์ œ ์ƒ๊ฐ์—๋Š”) ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์— ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ ํ•˜์ง€ ์•Š์•˜๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”

@gcorgnet - ๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์•ฑ์˜ ๋ชจ๋“  ํŽ˜์ด์ง€์— ๊ณตํ†ต ๋„๊ตฌ ๋ชจ์Œ์ด ์žˆ์ง€๋งŒ ๋„๊ตฌ ๋ชจ์Œ ๋‚ด์—์„œ ๋‚ด๊ฐ€ ์–ด๋–ค ํŽ˜์ด์ง€์— ์žˆ์—ˆ๋Š”์ง€์— ๋”ฐ๋ผ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ๋ฒ„ํŠผ๊ณผ ๋„๊ตฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ๋ฒ„ํŠผ/๋„๊ตฌ ๋ฐ ํ•ด๋‹น ๋…ผ๋ฆฌ๋ฅผ ๋ณด์œ ํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค์—ˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“ˆ ๋‚ด๋ถ€์— ์œ ์ง€ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณธ์งˆ์ ์œผ๋กœ ๋‚ด ๋ชจ๋“ˆ ์™ธ๋ถ€์—๋Š” ์ด๋Ÿฌํ•œ ํŠน์ • ๋„๊ตฌ ๋ชจ์Œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์•„๋Š” ๊ฒƒ์ด ์—†์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ณตํ†ต ๋„๊ตฌ ๋ชจ์Œ์— ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋„์›€์ด ๋  ๋งŒํ•œ ์ž‘์—… ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋„๊ตฌ ๋ชจ์Œ ์„œ๋น„์Šค๋กœ ํ•˜๋Š” ์ผ์€ ๊ด€์ฐฐ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ฟ์ด๋ฏ€๋กœ ๊ฒŒ์œผ๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๋Š” receiveContext ๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ๋„๊ตฌ ๋ชจ์Œ ๊ณตํ†ต ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ componentFactoryResolver ๋ฐ injector ์ฐธ์กฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. receiveContext ์ด๋ฒคํŠธ.

ํˆด๋ฐ”.์„œ๋น„์Šค.ts

@Injectable()
export class ToolbarService {
    contextReceivedSource = new Subject<any>();
    contextReceived$ = this.contextReceivedSource.asObservable();

    receiveContext(componentFactoryResolver: ComponentFactoryResolver, injector: Injector) {
        this.contextReceivedSource.next({ resolver: componentFactoryResolver, injector: injector });
    }
}

์ง€์—ฐ ๋กœ๋“œ๋œ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ componentFactoryResolver ๋ฐ injector ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ๋„๊ตฌ ๋ชจ์Œ ์„œ๋น„์Šค์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๊ณ  ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ง€์—ฐ ๋กœ๋“œ๋œ ๋„๊ตฌ ๋ชจ์Œ ๊ตฌ์„ฑ ์š”์†Œ

...
constructor(private componentFactoryResolver: ComponentFactoryResolver, private injector: Injector) {}
...
ngOnInit() {
  this.toolbarService.receiveContext(this.componentFactoryResolver, this.injector);
}
...

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋‚ด ํ•ต์‹ฌ ๋„๊ตฌ ๋ชจ์Œ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๋„๊ตฌ ๋ชจ์Œ ์„œ๋น„์Šค์˜ ๊ด€์ฐฐ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์„ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ํ•„์š”ํ•œ ๊ฒŒ์œผ๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ๋งŒ๋“ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑํ•œ componentRef ๋ฅผ ํŒŒ๊ดดํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

...
@ViewChild('toolbarTarget', {read: ViewContainerRef}) toolbarTarget: ViewContainerRef;
component: Type<Component>;
refInjector: ReflectiveInjector;
resolverSub: Subscription;
refInjector: ReflectiveInjector;
componentFactoryResolver: ComponentFactoryResolver;
injector: Injector;

ngOnInit() {
  this.resolverSub = this.toolbarService.contextReceived$.subscribe(resolver => {
      this.componentFactoryResolver = resolver.resolver;
      this.injector = resolver.injector;
    });
}

updateToolbar(data: any) {
    this.clearComponent();
    this.component = data['toolbar'];
    if (this.component) {
      const childComponent = this.componentFactoryResolver.resolveComponentFactory(this.component);
      this.refInjector = ReflectiveInjector
          .resolveAndCreate([{provide: this.component, useValue: this.component}], this.injector);
      this.componentRef = this.toolbarTarget.createComponent(childComponent, 0, this.refInjector);
    }
  }

  clearComponent() {
    this.toolbarTarget.clear();
    if (this.componentRef) { this.componentRef.destroy(); };
  }

  ngOnDestroy() {
    this.resolverSub.unsubscribe();
    this.clearComponent();
  }

๊ทธ๋Ÿฌ๋ฉด ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํ•ด๋‹น #toolbarTarget ๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๊ณณ์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.

<div #toolbarTarget></div>

์ œ์ณ๋‘๊ณ , ๊ฒฝ๋กœ์—์„œ ์ง€์—ฐ ๋กœ๋“œ๋œ ๊ตฌ์„ฑ ์š”์†Œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ๊ณตํ†ต ๋„๊ตฌ ๋ชจ์Œ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์ด ์ค„ this.component = data['toolbar']; ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ „์ฒด ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด ํ† ๋ก ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฉ๋‹ˆ๋‹ค.

{ path: '', component: yourComponent, data: { toolbar: yourToolbarComponentToInject } }

์ถ”๊ฐ€ ์งˆ๋ฌธ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”!

@jmcclanahan ๊ท€ํ•˜์˜ ์ฝ”๋“œ์— ๋Œ€ํ•ด ํ•œ ๊ฐ€์ง€ ์งˆ๋ฌธ(์•„๋งˆ๋„ ์–ด๋ฆฌ์„์€ ์งˆ๋ฌธ)์ด ์žˆ์Šต๋‹ˆ๋‹ค. "๊ฒŒ์œผ๋ฅธ ๋กœ๋“œ๋œ ๋„๊ตฌ ๋ชจ์Œ ๊ตฌ์„ฑ ์š”์†Œ"๋ฅผ ์–ธ๊ธ‰ํ•  ๋•Œ ngOnInit ์„น์…˜์— ์„œ๋น„์Šค ํ˜ธ์ถœ ์ฝ”๋“œ๋ฅผ ๋„ฃ์ง€๋งŒ ์–ด๋–ป๊ฒŒ ์ดˆ๊ธฐํ™”(๊ตฌ์„ฑ ์š”์†Œ)๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๊นŒ? HTML ์ฝ”๋“œ์— ์ถ”๊ฐ€ํ•˜๊ณ  ๋‚˜์ค‘์— DOM์—์„œ ์ˆจ๊ธธ ํ•„์š” ์—†์ด? ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ƒ๋‹จ ํ‘œ์‹œ์ค„์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ณณ์—์„œ๋Š” ๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@Dunos - ์œ„์˜ ์˜ˆ์—์„œ ๊ทธ ๋ถ€๋ถ„์„ ์™„์ „ํžˆ ์ƒ๋žตํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค! ์—ฐ๊ฒฐ๋œ ์ง€์—ฐ ๋กœ๋“œ ๋ชจ๋“ˆ์— ๋™์  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ entryComponent ๋กœ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋„๊ตฌ ๋ชจ์Œ ๊ตฌ์„ฑ ์š”์†Œ ์ž์ฒด์—์„œ ๋™์  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ‘œ์‹œํ•˜๋ ค๋Š” html ํ…œํ”Œ๋ฆฟ์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹์ฐธ์กฐํ•˜๋Š” ViewContainerRef ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ updateToolbar() ๋ฉ”์„œ๋“œ๊ฐ€ ๊ตฌ์„ฑ ์š”์†Œ ์ƒ์„ฑ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ง€์ •๋œ ์œ„์น˜์— ๋ฐฐ์น˜ํ•˜๊ณ  ๋„๊ตฌ ๋ชจ์Œ์— ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

@ViewChild('toolbarTarget', {read: ViewContainerRef}) toolbarTarget: ViewContainerRef;
...
updateToolbar(data: any) {
    this.clearComponent();
    this.component = data['toolbar'];
    if (this.component) {
      const childComponent = this.componentFactoryResolver.resolveComponentFactory(this.component);
      this.refInjector = ReflectiveInjector
          .resolveAndCreate([{provide: this.component, useValue: this.component}], this.injector);
      this.componentRef = this.toolbarTarget.createComponent(childComponent, 0, this.refInjector);
    }
  }

๊ทธ๋Ÿฌ๋ฉด ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํ•ด๋‹น #toolbarTarget์„ ๋ฐฐ์น˜ํ•˜๋Š” ๊ณณ์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.

<div #toolbarTarget></div>

clearComponent() ๋ฉ”์„œ๋“œ๋Š” ngOnDestroy()๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋˜์–ด ํŽ˜์ด์ง€๋ฅผ ๋– ๋‚  ๋•Œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

clearComponent() {
    this.toolbarTarget.clear();
    if (this.componentRef) { this.componentRef.destroy(); };
  }

  ngOnDestroy() {
    this.resolverSub.unsubscribe();
    this.clearComponent();
  }

๋˜ํ•œ ์œ„์˜ ์›๋ž˜ ๊ฒŒ์‹œ๋ฌผ์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด ๋งŽ์€ ์งˆ๋ฌธ์„ ๋ฐ›๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ์ด ๋™์  ๋„๊ตฌ ๋ชจ์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—… ์˜ˆ์ œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋งํฌ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@jmcclanahan ์„ ์–ป์—ˆ์ง€๋งŒ (๋‚ด ์ƒ๊ฐ์—๋Š”) ngOnInit๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋™์  ๊ตฌ์„ฑ ์š”์†Œ( this.toolbarService.receiveContext ํ˜ธ์ถœ ๋ถ€๋ถ„)์—์„œ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ํ˜ธ์ถœ์ด ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ์—ฌ์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. t ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค). entryComponents์— ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ onInit๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@Dunos- ์•„๋งˆ๋„ ์˜ˆ๊ฐ€ ๊ฐ€์žฅ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ์•ฑ์˜ ์ธ๋ฑ์Šค ํŽ˜์ด์ง€์—์„œ ํŽ˜์ด์ง€ A๋กœ ์ด๋™ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€ A์˜ ๋ชจ๋“ˆ/๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ •์˜ํ•˜๋Š” ํŽ˜์ด์ง€ A์— ๋Œ€ํ•œ ํ•ด๋‹น ๊ฒฝ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€ A์—๋Š” ์ „์—ญ ๋„๊ตฌ ๋ชจ์Œ์— ํ‘œ์‹œํ•  ๋ณ„๋„์˜ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Page A์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด๋ถ€์— ComponentFactoryResolver ๋ฐ Injector ๋ฅผ ์‚ฝ์ž…ํ•œ ๋‹ค์Œ receiveContext ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ ๋น„ํŠธ:

constructor(private componentFactoryResolver: ComponentFactoryResolver, private injector: Injector) {}
...
ngOnInit() {
  this.toolbarService.receiveContext(this.componentFactoryResolver, this.injector);
}

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๋„๊ตฌ ๋ชจ์Œ์— ํ‘œ์‹œํ•˜๋ ค๋Š” ๊ตฌ์„ฑ ์š”์†Œ์— ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ˜„์žฌ ์žˆ๋Š” ํŽ˜์ด์ง€์™€ ์—ฐ๊ฒฐ๋œ ๊ตฌ์„ฑ ์š”์†Œ์— ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋„ฃ์Šต๋‹ˆ๋‹ค.

@jmcclanahan ์•„ ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!!! ์ด์ œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค :)

@jmcclanahan ์ด ๊ฒŒ์‹œ๋ฌผ์„ ์ฐพ๊ธฐ ์ „์— ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•Œ์•„์ฐจ๋ฆฐ ํ•œ ๊ฐ€์ง€๋Š” ํ•จ์ˆ˜ ์„ ์–ธ์— ๋ช‡ ๊ฐœ์˜ ๋ฌธ์ž๋ฅผ ์ €์žฅํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ „๋‹ฌํ•œ ์ธ์ ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ComponentFactoryResolver์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ทธ๋ƒฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
injector.get(ComponentFactoryResolver);

๊ทธ๋ฆฌ๊ณ  ํ•„์š”ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฒฐ๊ตญ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ComponentFactoryResolver๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚ด ๋ฌธ์ œ๋„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด, ๋‹น์‹ ์ด ์•Œ์•„์•ผ ํ•  ๊ฒƒ์€ ๋‹น์‹ ์ด lazy ๋ชจ๋“ˆ์—์„œ ์„ ์–ธ๋œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ธฐ๋ฅผ ์›ํ•  ๋•Œ ๋‹น์‹ ์€ ์‹ค์ œ๋กœ ๊ทธ lazy ๋ชจ๋“ˆ์—์„œ ์„ ์–ธ๋œ ์ปดํฌ๋„ŒํŠธ๋กœ๋ถ€ํ„ฐ ComponentFactoryResolver๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฃจํŠธ ์ธ์ ํ„ฐ(๋ฃจํŠธ ComponentFactoryResolver ํฌํ•จ)๋Š” ๋กœ๋“œ๋œ lazyModule์—์„œ ์„ ์–ธ๋œ entryComponents์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ข€ ์ด์ƒํ•ด ๋ณด์ด์ง€๋งŒ ์ด๊ฒƒ์ด Angular๊ฐ€ ์„ค๊ณ„๋œ ๋ฐฉ์‹(์ดํ•ด๊ฐ€ ๋จ)์ด์ง€๋งŒ ์‹ค์ œ๋กœ imho ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์ž‘์—…ํ•  ๋•Œ ์ถ”๊ฐ€ ๋ณต์žก์„ฑ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Angular ํŒ€์ด ์ด๊ฒƒ์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•: ๊ฒฝ๋กœ๊ฐ€ ํ™œ์„ฑํ™”๋  ๋•Œ๋งˆ๋‹ค ๋ฃจํŠธ ์ธ์ ํ„ฐ๋Š” ํ•ด๋‹น lazyModule์— ๋‚˜์—ด๋œ entryComponents๋ฅผ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋ฉฐ ๊ฒฝ๋กœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ด์ „์— ์ถ”๊ฐ€๋œ entryComponents๊ฐ€ ์ž๋™์œผ๋กœ ์†Œ๋ฉธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ณต์žก์„ฑ์ด ์ค„์–ด๋“ค๊ณ  ์˜ค๋ฒ„ํ”Œ๋กœ๊ฐ€ ๋ฐฉ์ง€๋ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ๊ตฌ์„ฑ ์š”์†Œ ํŒฉํ† ๋ฆฌ๊ฐ€ ์žˆ๋Š” ๋ฃจํŠธ ์ธ์ ํ„ฐ.

์ด์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ ์š”์ฒญ์„ ์ œ์ถœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๊ฐ์‚ฌ ํ•ฉ๋‹ˆ๋‹ค @jmcclanahan

@jmcclanahan ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!! @renatoaraujoc ์ด ๊ธฐ๋Šฅ์„ Angular ํŒ€์— ์ œ์ถœํ•˜์…จ์Šต๋‹ˆ๊นŒ?

@rraya ์ด "๋ฌธ์ œ"์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ ์š”์ฒญ์„ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค(์ƒ๊ฐํ•ด ๋ณด๋ฉด ๋ณ„ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค). #17168์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์—ฌ๊ธฐ์— ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์•ฑ์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ๋ถ€๋ถ„์ด ๋ชจ๋‹ฌ์„ ์—ด๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœํ•˜๋Š” open ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” AppModule์— ModalManagerService๋ฅผ ๋งŒ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ „๋‹ฌ๋ฐ›์€ ๋‹ค์Œ ๋ชจ๋‹ฌ๋กœ ์—ด๋ฆฝ๋‹ˆ๋‹ค. ๋˜ํ•œ ์„ธ์…˜ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋กœ ์ธํ•œ ๊ฒฝ๋กœ ๋ณ€๊ฒฝ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ์ž๊ฐ€ ๋ชจ๋‹ฌ์„ ๋‹ซ๋Š” ๊ฒƒ ์ด์™ธ์˜ ๋‹ค๋ฅธ ์ž‘์—…์œผ๋กœ ๋ชจ๋‹ฌ์„ ๋‹ซ์•„์•ผ ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” closeAll ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@jmcclanahan ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋‹น์‹ ์˜ ์˜๊ฒฌ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ œ์•ˆ์ด ์žˆ์œผ๋ฉด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. 'this.componentFactoryResolver.resolveComponentFactory'์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@Dunos ๋‚˜ ์ข€ ๋„์™€์ค„ ์ˆ˜ ์žˆ๋‹ˆ?๋‚˜๋Š” ๋ช‡ ์ฃผ ๋™์•ˆ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๊ฒช์—ˆ๊ณ  ์ •๋ง ๋จธ๋ฆฌ๊ฐ€ ์•„ํ”„๋‹ค.

@์›Œ์ธ  ,

๋‹น์‹ ์ด ์ดํ•ดํ•ด์•ผ ํ•  ๊ฒƒ์€ ์ง€์—ฐ ๋กœ๋“œ๋œ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค ํ™œ์„ฑํ™”๋œ ๊ฒฝ๋กœ๊ฐ€ ํ•ด๋‹น lazyModule์— ๋Œ€ํ•œ entryComponents๋ฅผ ํฌํ•จํ•˜๋Š” ์ž์‹ ์ธ์ ํ„ฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. AppModule(์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฃจํŠธ ์ธ์ ํ„ฐ)์— ์ •์˜๋œ ์ „์—ญ modalService๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ componentFactoryResolver๋Š” ๋ชจ๋“  lazyModule์˜ ์ƒˆ entryComponents๋ฅผ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” lazyModule์˜ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๋ณด์™„ ํŒฉํ† ๋ฆฌ ๋ฆฌ์กธ๋ฒ„์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์–ด๋–ป๊ฒŒ๋“  modalService์— "์ด ์ธ์ ํ„ฐ/์ปดํฌ๋„ŒํŠธ ํŒฉํ† ๋ฆฌ ๋ฆฌ์กธ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” entryComponent๋ฅผ ๋ Œ๋”๋งํ•˜์‹ญ์‹œ์˜ค"๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์กฐ๊ธˆ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒƒ ๊ฐ™์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@renatoaraujoc ์„ค๋ช…ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋Š” ๋งํฌ์—์„œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋กœ๋“œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์™ผ์ชฝ ์‚ฌ์ด๋“œ๋ฐ”์—์„œ ๋ฉ”๋‰ด๋ฅผ ํด๋ฆญํ•˜๊ณ  ์ง€์—ฐ ๋กœ๋“œ๋œ ๋ชจ๋“ˆ์—์„œ ๋ชจ๋“ˆ์„ ๊ฒ€์ƒ‰ํ•œ ๋‹ค์Œ ์ƒ์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋™์  ๊ตฌ์„ฑ ์š”์†Œ๋Š” ํƒญ๊ณผ ๊ฐ™์€ ์•ฑ์„ ๋งŒ๋“ค๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์— ์˜ฌ๋ฐ”๋ฅธ ๊ธฐ๋ณธ ์ฝ˜ํ…์ธ  ์˜์—ญ์— ์ผ๋ถ€ ๊ตฌ์„ฑ ์š”์†Œ ์ฝ˜ํ…์ธ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํƒญ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ฝ˜ํ…์ธ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ์†”๋ฃจ์…˜ ๊ตฌ์ถ• ํƒญ์ด ์žˆ์Šต๋‹ˆ๊นŒ? angular2/4๋ฅผ ํ†ตํ•œ ์•ฑ๊ณผ ๊ฐ™์€?

์–ด์จŒ๋“ , lazyload ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ดˆ๊ธฐํ™”๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์„œ๋น„์Šค์— componentFactoryResolver๋ฅผ ์•Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ์•ฑ์—๋Š” AppModule์ด ์žˆ๊ณ  CoreModule์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋‚ด ContentTabModule(ํƒญ์…‹์„ ๋กœ๋“œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ)์€ CoreModule์— ์†ํ•˜๋ฉฐ ๋ชจ๋“  ์ƒ์„ฑ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ContentTabModule์—์„œ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ๋ฉ”๋‰ด๋ฅผ ํด๋ฆญํ•  ๋•Œ ์„œ๋น„์Šค, ๊ตฌ์„ฑ ์š”์†Œ, ์ง€์‹œ๋ฌธ, ํŒŒ์ดํ”„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งํฌ, ContentTabService๋Š” ๋ฉ”๋‰ด params์—์„œ ๋™์  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ํŒจ๋„์— ๋กœ๋“œ๋œ ์ผ๋ถ€ ํŠธ๋ ํฌ(์›นํŒฉ ์‚ฌ์šฉ)๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ง€์—ฐ ๋กœ๋“œ ๋ชจ๋“ˆ์—์„œ ์‹œ์—ฐ๋œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@renatoaraujoc lazyModule์˜ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ComplementFactoryResolver์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? lazymodule์˜ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ๋” ์–ด๋ ต๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(๋˜๋Š” ๋‚ด๊ฐ€ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค).

@werts ์œ„์—์„œ @jmcclanahan ๊ณผ ๋‚˜๋ˆˆ ๋Œ€ํ™”๋ฅผ ํ™•์ธํ•˜๊ณ  ๋„๊ตฌ ๋ชจ์Œ๊ณผ ๋น„์Šทํ•œ ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.

@Dunos @jmcclanahan ์˜ ์˜ˆ์ œ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. lazyload ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ง€์—ฐ๋กœ๋“œ ๋ชจ๋“ˆ์—์„œ this.toolbarService.receiveContext()๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

@werts ๊ฒฝ๋กœ์™€ ํ•จ๊ป˜ ์ง€์—ฐ ๋ชจ๋“ˆ์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋กœ๋“œํ•ด์•ผ ํ•˜๋ฉฐ ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ๋Š” Injector ๋ฐ ComponentFactoryResolver๋กœ aux ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค.

@Dunos ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํŽธ๋ฆฌํ•œ ๊ฒฝ์šฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งํฌ ํด๋ฆญ์—์„œ ๋ชจ๋“ˆ์„ ์ง€์—ฐ ๋กœ๋“œํ•œ ๋‹ค์Œ ๋™์  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ?

@werts ... ๋„ค, ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์‹œ์ž‘์ ์€ https://github.com/Toxicable/module-loading ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ข‹์•„, ์ง€๊ธˆ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค. @mlc-mlapis

@werts et al: ์ด ์ง€์› ์Šค๋ ˆ๋“œ๋ฅผ ๋‹ค๋ฅธ ์ฑ„๋„๋กœ ๊ฐ€์ ธ๊ฐˆ ๊ฒƒ์„ ๊ถŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? StackOverflow ๋˜๋Š” Gitter๊ฐ€ ๋” ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์žˆ๋Š” ๊ทธ๋Œ€๋กœ, ๋‚˜๋Š” ์ด ๋ฌธ์ œ๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ(๋‹ค๋ฅธ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค) ํ˜„์žฌ ๋งŽ์€ ์†Œ์Œ์„ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ์žˆ์–ด ์ฃผ์ œ์—์„œ ์กฐ๊ธˆ ๋ฒ—์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”Œ๋Ÿฌ์Šค ์ธก๋ฉด: ๋„์›€์ด ๋˜๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๋ณด๋‹ˆ ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค!

์ด ๋ฌธ์ œ๊ฐ€ ์ง€์—ฐ ๋กœ๋“œ๋œ ๋ชจ๋“ˆ๊ณผ ํ•จ๊ป˜ ์ง๋ฉดํ•ด์•ผ ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์žฅ์• ๋ฌผ์ด๋ผ๋Š” ๊ฒƒ์ด ๋ฏฟ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ฒŒ์œผ๋ฅธ ๋ชจ๋“ˆ์„ ์‰ฝ๊ฒŒ ์ œ๊ฑฐ/๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ๊ฒŒ์œผ๋ฅธ ๋ชจ๋“ˆ์˜ ์ž์‹์„ ๋ถ€๋ชจ(app.module)๋กœ๋ถ€ํ„ฐ ์ต๋ช…์œผ๋กœ ์œ ์ง€ํ•˜๋Š” ์†”๋ฃจ์…˜์„ ํ•„์‚ฌ์ ์œผ๋กœ ์ฐพ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. app.component.html์˜ <router-outlet name="app-popup"> ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์•ฑ์˜ ๊ฒฝ์šฐ(ComponentFactory๊ฐ€ ์ž‘์—…์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉฐ ํฌ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค) ๊ฒŒ์œผ๋ฅธ ์ž์‹ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋ฒ…์ฐผ์Šต๋‹ˆ๋‹ค. ์ด์ œ์•ผ lazy-modules entry-children๊ณผ ๊ด€๋ จ๋œ entry-components ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์œผ๋ฅธ ์ž์‹ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด ๋ฃจํŠธ ๋ชจ๋“ˆ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‚ด ๋ชจ๋“ˆ์„ ์ ์ ˆํ•˜๊ฒŒ ๊ฒฉ๋ฆฌ๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Angular ํŒ€์ด ์ด๊ฒƒ์„ ๊ณง ๋ฌธ์ œ๋กœ ์ธ์‹ํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๊ทธ๋“ค์ด ๊ฒŒ์œผ๋ฅธ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์•ฑ ์ „์ฒด ๋ผ์šฐํ„ฐ ์ฝ˜์„ผํŠธ์— ๋Œ€ํ•œ ๋‚ด ๋ฌธ์ œ์— ์‘๋‹ตํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/angular/angular/issues/19520

์ฒ˜์Œ์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ์—†์—ˆ๊ณ ,
'๋ทฐ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž! '๋ผ๊ณ  jQuery ํŒ€์€ ๋งํ•ฉ๋‹ˆ๋‹ค.
'๋ชฉ๋ก์„ ๋งŒ๋“ค์ž! '๋ผ๊ณ  Angular ํŒ€์€ ๋งํ•ฉ๋‹ˆ๋‹ค.

@jmcclanahan ์ด์ œ ngComponentOutlet์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ํ›จ์”ฌ ๊ฐ„๋‹จํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

<ng-container  *ngComponentOutlet="yourComponentClass;injector: yourInjector;"></ng-container>

@crysislinux ngComponentOutlet์€ ํ›Œ๋ฅญํ•˜์ง€๋งŒ ์•„์ง ๊ตฌ์„ฑ ์š”์†Œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์†”๋ฃจ์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ? =/

๋ฐฉ๊ธˆ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ œ์•ˆ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋Š๋ฆฌ๊ฒŒ ๋กœ๋“œ๋œ ๋ชจ๋“ˆ์— ๋‹ค๋ฅธ ์ข…์† ๋ชจ๋“ˆ(์ด ๊ฒฝ์šฐ NGX ๋ชจ๋‹ฌ ๋ชจ๋“ˆ)์˜ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์ง€๋งŒ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ๋‚ด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๋น„๋‚œํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ui-router๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋‚˜์š”? ์•„๋‹ˆ๋ฉด Angular์˜ ์ž์ฒด ๋ผ์šฐํ„ฐ ๋‹ค์ค‘ ์ฝ˜์„ผํŠธ ๊ธฐ๋Šฅ๋„ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋“ค์€ ๋ฐฐํ›„์—์„œ ์ด๋Ÿฌํ•œ ๋…ผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ Angular 1.x์—์„œ ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์ด๋ฉฐ ์ด๋ฅผ Angular 2+๋กœ ์ „ํ™˜ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋„๊ตฌ ๋ชจ์Œ ์˜ˆ์ œ์—์„œ ui-view(์•„๋งˆ๋„ ๋ช…๋ช…๋œ ๋ณด๊ธฐ ๋˜๋Š” ์•ต๊ทค๋Ÿฌ ๋ผ์šฐํ„ฐ์˜ ๊ฒฝ์šฐ ๋ผ์šฐํ„ฐ ์ฝ˜์„ผํŠธ)๋Š” ๋” ๋†’์€ ์ˆ˜์ค€์˜ ๋ชจ๋“ˆ์—์„œ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ์ง€์—ฐ ๋กœ๋“œ๋œ ๋ชจ๋“ˆ ์ƒํƒœ๊ฐ€ ๋„๊ตฌ ๋ชจ์Œ ui-view๋ฅผ ์ž์ฒด ์ฝ˜ํ…์ธ ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊ฒฝ์šฐ "์ž‘๋™"ํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ํ˜„์žฌ ๋ชจ๋“ˆ ์™ธ๋ถ€์˜ ์ƒ์œ„ ์ˆ˜์ค€ ๋ณด๊ธฐ๋ฅผ ๊ต์ฒดํ•ด์•ผ ํ•˜๋Š” ์ง€์—ฐ ๋กœ๋“œ๋œ ํ™˜๊ฒฝ์—์„œ ui-router๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. . ์ด๋Š” Angular 1.x์— ๋น„ํ•ด ๋งค์šฐ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค.

์œ„์˜ ์˜ˆ๋Š” ui-router/angular ๋ผ์šฐํ„ฐ๊ฐ€ ํ•ด๊ฒฐํ•˜๋„๋ก ์„ค๊ณ„๋œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

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

์œ„์˜ @jmcclanahan ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

this.componentRef = this.toolbarTarget.createComponent(childComponent, 0, this.refInjector);. $ ๋‹ค์Œ์— $ this.componentRef.changeDetectorRef.markForCheck(); ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด HostBinding ์†์„ฑ์ด ํŠธ๋ฆฌ๊ฑฐ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‚˜์—๊ฒŒ ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ๋˜ ์ž ์žฌ์ ์ธ ์†”๋ฃจ์…˜์œผ๋กœ ์Šค์œ™์„ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์›๋ž˜ plunkr์˜ ํฌํฌ์ž…๋‹ˆ๋‹ค.
http://plnkr.co/edit/x3fdwqrFDQr2og0p6gwr?p=preview

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด entryComponent(Page1Module)๊ฐ€ ์žˆ๋Š” ๋ชจ๋“ˆ์— ์ œ๊ณต๋œ ์„œ๋น„์Šค(ResolverService)์—์„œ ๊ตฌ์„ฑ ์š”์†Œ ํŒฉํ† ๋ฆฌ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๊ฒฐ๋œ ํŒฉํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  MainComponent์˜ ๋ณด๊ธฐ์— ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋‘ ๋ฒˆ์งธ ์„œ๋น„์Šค(ChangerService)๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์‹ฌ๊ฐํ•˜๊ฒŒ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ ์ด ๋นŒ์–ด๋จน์„ ๋ผ์šฐํ„ฐ์ž…๋‹ˆ๋‹ค. ์ด plunker๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค( @patkoeller ์˜ ์˜ˆ์—์„œ ๋ถ„๊ธฐ๋จ)
http://plnkr.co/edit/keMuCdU9BwBDNcaMUAEU?p=๋ฏธ๋ฆฌ๋ณด๊ธฐ @ src/page1.ts

๋‚ด๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์€ ์ผ๋ถ€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ตœ์ƒ์œ„ ์•ฑ์— ์‚ฝ์ž…ํ•˜๊ณ  /page-1/sub/component [routerLink]="['./', 'sub', 'component'] ์™€ ๊ฐ™์€ ์ง€์—ฐ ๋กœ๋“œ ๋ชจ๋“ˆ์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ๋ช…๋ น๊ณผ ํ•จ๊ป˜ [routerLink] ์ง€์‹œ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ActivatedRoute $๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ ํ„ฐ๋ฅผ createComponent ์— ์ „๋‹ฌํ•˜๊ณ  ์ œ ๊ฒฝ์šฐ์— ์ž‘๋™ํ•˜๋ฉด ๋‹ค๋ฅธ ๋ชจ๋“  routerLink๋ฅผ ๋ง์น  ์ˆ˜ ์žˆ์ง€๋งŒ router.routerState.snapshot ๋ฅผ state ์— ๋‹ค์‹œ ํ• ๋‹นํ•˜๋ฉด

๋ฒ„๊ทธ๋ฅผ ์‹ ๊ณ ํ•ด์•ผ ํ•˜๋‚˜์š”?

๋‚ด ๋Œ€ํ™” ์‹ฑ๊ธ€ํ†ค ์„œ๋น„์Šค์˜ ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ์™€ ๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ๊ด€๋ จ ๋ชจ๋‹ฌ ๊ตฌ์„ฑ ์š”์†Œ๋Š” @jmcclanahan ์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์—†์ด๋„ ํ•ด๋‹น ๋ชจ๋“ˆ์— ๋‚จ์•„ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ETA๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ ์–ด๋„ Angular ํŒ€์˜ ์‘๋‹ต์ž…๋‹ˆ๊นŒ? ๋ชจ๋“ˆ ์บก์Šํ™”๊ฐ€ ์ฐฝ ๋ฐ–์œผ๋กœ ๋˜์ ธ์กŒ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ธฐ๋Šฅ์ด ์—†๋Š” ๊ฒƒ์€ ์ •๋ง ๋‚˜์œ ์ผ์ž…๋‹ˆ๋‹ค. @angular/material์— ๋Œ€ํ•œ ๋ชจ๋“  ๋Œ€ํ™” ์ƒ์ž๋Š” ๋ฃจํŠธ ๋ชจ๋“ˆ์—์„œ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@xban1x ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ง„์ „์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์˜ ๋‘˜๋Ÿฌ๋ณด๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค :(

@jmcclanahan ๊ท€ํ•˜์˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ์ž…๋œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ฐธ์กฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์ฃผ์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํŠธ๋ฆฌ btw์ด๋ฏ€๋กœ ์ด์ œ ํŠธ๋ฆฌ๋ฅผ ์ฃผ์ž…ํ•œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ํŠธ๋ฆฌ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๊ตฌ๋…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌธ์ œ #23819์—์„œ ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ providesIn: 'root' ์„œ๋น„์Šค์™€ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์งˆ๋ฌธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฌธ์ œ๊ฐ€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ๋‹ซ์•˜์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๊ฐ€ ๋นจ๋ฆฌ ํ•ด๊ฒฐ๋˜์—ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค. :)

์—…๋ฐ์ดํŠธ

์ถ•์†Œ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์„œ๋น„์Šค์— providesIn ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์„ ๋•Œ ์ด๋ฏธ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํŒฉํ† ๋ฆฌ๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค(๋ชจ๋“ˆ๋กœ ๊ฐ€์ ธ์˜ฌ ํ•„์š” ์—†์ด), ์ดํ•ดํ•˜๋ฉด ๋ฐ”๋ฅด๊ฒŒ:

var Injectable = makeDecorator('Injectable', undefined, undefined, undefined, function (injectableType, options) {
    if (options && options.providedIn !== undefined &&
        injectableType.ngInjectableDef === undefined) {
        injectableType.ngInjectableDef = defineInjectable({
            providedIn: options.providedIn,
            factory: convertInjectableProviderToFactory(injectableType, options)
        });
    }
});

@Component({ ... entryComponent: true }) ์™€ ๊ฐ™์€ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ์š”์†Œ์— ์œ ์‚ฌํ•œ ๋…ผ๋ฆฌ๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ์ฒญํฌ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ํŒฉํ† ๋ฆฌ๊ฐ€ ๋ฆฌ์กธ๋ฒ„ ์— ์ •์˜๋ฉ๋‹ˆ๋‹ค(๋‹ค์Œ์„ ํฌํ•จํ•˜๋Š” ๋ชจ๋“ˆ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค). ๊ตฌ์„ฑ ์š”์†Œ ์ข…์†์„ฑ์ด ์žˆ๋Š” entryComponents ์˜ ๊ตฌ์„ฑ ์š”์†Œ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•จ).

@lucasbasquerotto ... ๋‹ค์Œ ๋…ผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๊ณ  ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ ์œ ํ˜•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(ํ•ด๋‹น ๋ชจ๋“ˆ์— ์ง์ ‘ ์ €์žฅ๋œ ๋ฌธ์ž์—ด ํ‚ค <-> ๊ตฌ์„ฑ ์š”์†Œ ์œ ํ˜• ๊ฐ„์˜ ์ž์ฒด ๋งคํ•‘ ์‚ฌ์šฉ).

this._loader.load(url)
    .then((_ngModuleFactory: NgModuleFactory<any>) => {
        const _ngModuleRef: NgModuleRef<any> = _ngModuleFactory.create(this._injector);
        const _cmpType: Type<any> = _ngModuleRef.instance.cmps.get('dynamic');
        const _cmpFactory: ComponentFactory<any> = _ngModuleRef
            .componentFactoryResolver
            .resolveComponentFactory(_cmpType);
        this._cmpRef = this.vc.createComponent(_cmpFactory, 0, this._injector, []);
    });

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ์ง€๊ธˆ์€ ์—ฌ๋Ÿฌ ์ง€์—ฐ ๋กœ๋“œ ๋ชจ๋“ˆ ํ•ด์„๊ธฐ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ์‹ฑ๊ธ€ํ†ค ํด๋ž˜์Šค๋ฅผ ๊ฐ–๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
Angular์˜ ์ƒˆ ๋ฒ„์ „์œผ๋กœ ์ด๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?
๊ฐ์‚ฌ ํ•ด์š”

์•ˆ๋…• ๋ชจ๋‘๋“ค,

๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์†”๋ฃจ์…˜์˜ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•ด ๋” ๋‚˜์•„๊ฐ€ ๊ธ€๋กœ๋ฒŒ ์„œ๋น„์Šค์˜ ํ•„์š”์„ฑ์„ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์€ RouteConfigLoadEnd ์ด๋ฒคํŠธ์˜ loadedConfig ๊ฐœ์ธ ๋ณ€์ˆ˜๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. LoadedRouterConfig ์œ ํ˜•์˜ ์ด ๊ฐœ์ธ ๋ณ€์ˆ˜์—๋Š” ๋กœ๋“œ๋œ ๋ชจ๋“ˆ, ํ•ด๋‹น ์ธ์ ํ„ฐ ๋ฐ componentFactoryResolver๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ๊ธฐ๋Šฅ ์š”์ฒญ์œผ๋กœ ์ œ์•ˆํ•˜๋ ค๋ฉด ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ด์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
---------- ์ˆ˜์ • ํ›„

๋‚ด ์งˆ๋ฌธ์€ ์‹ ๊ฒฝ์“ฐ์ง€ ๋งˆ์„ธ์š”. ์ด ๊ธฐ๋Šฅ ์š”์ฒญ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. https://github.com/angular/angular/issues/24069

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋‚ด ์ถ”๊ฐ€ ๋ชจ๋“ˆ์€ lazy loaded ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. entryModules ๋ฅผ SharedFeatureModule (ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ๋กœ๋“œ๋จ)์—์„œ CoreModule ๋กœ ์ด๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด์ œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ์˜๊ฒฌ์œผ๋กœ๋Š” ์ข‹์ง€ ์•Š์€ ๊ธฐ๋Šฅ ๊ด€๋ จ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ฝ”์–ด๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ?

@jmcclanahan ์˜ ์†”๋ฃจ์…˜

{ path: '', component: yourComponent, data: { toolbar: yourToolbarComponentToInject } }

๋์— ๋นˆ ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋™์  ์ด๋™ ๊ฒฝ๋กœ๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•˜๋ฉด ์ด๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

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

์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์†”๋ฃจ์…˜์—๋Š” ๊ธ€๋กœ๋ฒŒ ์‚ฌ์ด๋“œ๋ฐ”๋ฅผ ์—ด ์ˆ˜ ์žˆ๋Š” ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ์— ComponentFactoryResolver ๋ฐ Injector ๋ฅผ ์ƒ์„ฑ์ž ์ฃผ์ž…ํ•˜๋Š” ์ž‘์—…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ˜ธ์ถœ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ํ•ด๋‹น ์ฐธ์กฐ(์ž์ฒด)๋ฅผ ์›ํ•˜๋Š” Component ์™€ ํ•จ๊ป˜ ์„œ๋น„์Šค์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค๋Š” ์ด๋Ÿฌํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•˜๊ณ  ์žฅํ™ฉํ•ฉ๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž์ฒด ํ•˜์œ„ ๋ชจ๋“ˆ์— ๋„ฃ๊ณ  ์•ฑ์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

@broweratcognitecdotcom ์ด ๋ฌธ์ œ์˜ ์š”์ ์€ ์ง€์—ฐ ๋กœ๋“œ๋œ ๋ชจ๋“ˆ ์˜ entryComponents ์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. AppModule ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ชจ๋“  ํ•˜์œ„ ๋ชจ๋“ˆ์„ ํฌํ•จํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๊ฐ•์ œ๋กœ ๋กœ๋“œ ๋˜์–ด ์‹œ์ž‘ ์‹œ ์„ฑ๋Šฅ ๋ฌธ์ œ ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ(์†Œ๋น„์ž)์— ๋Œ€ํ•ด ๋ถˆ๊ฐ€์ง€๋ก ์ ์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋งํ•  ๊ฒƒ๋„ ์—†๊ณ , ํ•ด๋‹น ๋ชจ๋“ˆ์ด ์ง„์ž… ๊ตฌ์„ฑ ์š”์†Œ ๋˜๋Š” ์ผ๋ฐ˜ ๊ตฌ์„ฑ ์š”์†Œ(html์— ์„ ์–ธ๋จ)๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์†Œ๋น„์ž๋Š” ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ AppModule์— ๋„ฃ์œผ๋ฉด ์™œ ๊ฑฐ๊ธฐ์— ์žˆ๋Š”์ง€ ์•Œ๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๊ฒ€์ƒ‰ํ•ด์•ผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

@lucasbasquerotto ... ๊ทธ๋Ÿฐ ๊ฒŒ์œผ๋ฅธ ๋ชจ๋“ˆ์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค... ๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  ๊ถŒํ•œ์ด ์žˆ๊ณ  ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด ํ‚ค ๋ฐ ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋งต์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฃจํŠธ ํ™•์ธ์ž์—์„œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ์ด์ƒํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ํ›„ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ _factories ๋งต์—์„œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ์–ด๋–ป๊ฒŒ ๋“  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋น„๊ต๋˜์ง€ ์•Š๊ณ  ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

@jmcclanahan @Dunos ๊ธฐ๋Šฅ ๋ชจ๋“ˆ์ด ์ธ์ ํ„ฐ ์ฐธ์กฐ๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” ๋Œ€์‹ (๋ฉ”์ธ ์•ฑ ๋ชจ๋“ˆ์— ์ปจํ…์ŠคํŠธ ๋“ฑ๋ก) ์‹ค์ œ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด๊ฒฐ๋œ ํŒฉํ† ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” FactoryResolver๋ผ๋Š” ์„œ๋น„์Šค๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ž์ฒด ๋ชจ๋“ˆ์˜ ์ธ์ ํ„ฐ์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ์ฐธ์กฐ๋ฅผ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ๊ณต๊ฐœ API๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋น„์Šทํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•˜์ง€๋งŒ ๋‚ด ๋ชจ๋“ˆ์ด ์ง€์—ฐ ๋กœ๋“œ๋˜์ง€ ์•Š๊ณ  ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ฌธ์ œ์— ๋ถ€๋”ช์ณค์Šต๋‹ˆ๋‹ค. ์ด๋ก ์ ์œผ๋กœ ์—ฌ๊ธฐ์—์„œ ๋ถ„๋ช…ํ•œ ๊ฒƒ์„ ๋†“์น˜๊ณ  ์žˆ์ง€ ์•Š๋Š” ํ•œ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@h-arora ๋‚˜๋Š” comp๋ฅผ๋ณด๊ณ  ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. _factories์— ์žˆ์ง€๋งŒ ๋ฌธ์ œ๋Š” ๋ชจ๋“ˆ์— ์‹ค์ œ๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ๋นŒ๋“œ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

#17168์—์„œ ๊ทน๋ณต(์ด๊ฒƒ์˜ ๋ณต์ œ๋ณธ์œผ๋กœ ํ์‡„๋จ)

ํ˜„์žฌ ํ–‰๋™
์•ฑ์˜ RootInjector์—์„œ ์ œ๊ณตํ•˜๋Š” ComponentFactoryResolver๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ์‹ฑ๊ธ€ํ†ค ์„œ๋น„์Šค๊ฐ€ ์žˆ๊ณ  ์ง€์—ฐ ๋ชจ๋“ˆ์— ์„ ์–ธ๋œ entryComponent๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋ฃจํŠธ ์ธ์ ํ„ฐ๊ฐ€ ์ด์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™
์ด๊ฒƒ์€ ๋ฃจํŠธ ์ธ์ ํ„ฐ๊ฐ€ ์ž์‹ ์ธ์ ํ„ฐ์— ์˜ํ•ด ์•Œ๋ ค์ง„ entryComponents์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ์‹ค์ œ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์ž…๋‹ˆ๋‹ค.

ํ–‰๋™์„ ๋ฐ”๊พธ๋Š” ๋™๊ธฐ/์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
๋™๊ธฐ๋Š” Angular์˜ ๋ชจ๋“ˆ์‹ ์„ค๊ณ„๊ฐ€ ์ •ํ™•ํ•˜์ง€๋งŒ ๋ณต์žก์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๋™์  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ๋„ ๋ฒ„์ „: 2.4.9

์ œ์•ˆ๋œ ์†”๋ฃจ์…˜: ์ด๊ฒƒ์€ Angular ์ž์ฒด์—์„œ ์ฑ„ํƒํ•œ ๋ชจ๋“ˆ์‹ ์„ค๊ณ„์— ์–ด๊ธ‹๋‚˜์ง€๋งŒ, LazyModule์˜ entryComponents๋ฅผ RootInjector์˜ entryComponents์— ์ถ”๊ฐ€ํ•˜๊ณ  ํƒ์ƒ‰ํ•  ๋•Œ๋งˆ๋‹ค RootInjector ๋ฒ”๋žŒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋™์  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ œ๊ณต๋˜๋Š” ๋ณต์žก์„ฑ์„ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (LazyModule์„ ํŒŒ๊ดด), ์ด์ „์— ์ฃผ์ž…๋œ entryComponents๋Š” ๋ฐฐ์—ด์—์„œ ์ง€์›Œ์ง‘๋‹ˆ๋‹ค.

๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด:

ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋จ -> RootInjector๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
LazyModule -> ChildInjector๊ฐ€ ์ƒ์„ฑ๋˜๋„๋ก ํ™œ์„ฑํ™”ํ•˜๋Š” ํƒ์ƒ‰์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
RootInjector.entryComponents.append(childInjector.entryComponents)
๋‹ค๋ฅธ ๊ณณ์œผ๋กœ์˜ ํƒ์ƒ‰ ๋ฌธ์ œ -> LazyModule์ด ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํŒŒ๊ดด๋ฉ๋‹ˆ๋‹ค.
RootInjector.entryComponents.destroyLastAppendedEntryComponents()
์ข‹์€ ๊ฒƒ์„ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์€ ์˜ˆ์ •๋œ ๊ฒƒ์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋ชจ์ƒ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์œ„์—์„œ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ.

@ravtakhar ์•„๋งˆ๋„ ์ด๊ฒƒ์ด ๋ฐฑ๋กœ๊ทธ์— ์žˆ๊ณ  ํ˜„์žฌ ํ• ๋‹น๋œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์€ ์˜ˆ์ •๋œ ๊ฒƒ์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋ชจ์ƒ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์œ„์—์„œ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ.

์—ฌ๊ธฐ์— ๊ฐ™์€ ๋ฌธ์ œ

@tmirun ... ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ด๋Ÿฌํ•œ ๊ฒŒ์œผ๋ฅธ ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๋ฉด ... ๋ชจ๋“  ๊ถŒํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ... ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ชจ๋“ˆ ์ฐธ์กฐ๋ฅผ ์–ป๊ณ  moduleRef.componentFactoryResolver.resolveComponentFactory(entryComponentType) ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ๋งŽ์€ ๋ฌธ์ œ์™€ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ  ๋ชจ๋“  ๋‹จ์ผ lazyLoaded ๋ชจ๋“ˆ์ด ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋กœ๋“œํ•˜๋„๋ก appModule์— ์žˆ๋Š” ํ•ญ๋ชฉ์„ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  entryComponents๋ฅผ ์„ ์–ธํ•˜๊ณ  ๋‚ด๋ณด๋‚ด๊ณ  ๋‚ด๋ณด๋‚ด๋Š” ๋…๋ฆฝ ์‹คํ–‰ํ˜• ๋ชจ๋“ˆ์„ ๋งŒ๋“ค์–ด ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ฐพ์€ ์œ ์ผํ•œ ๋‹ค๋ฅธ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์€ entryComponent ๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ๋ชจ๋“ˆ์— ๋”ฐ๋ผ ์‚ฌ์šฉ์ž ์ •์˜ ComponentFactoryResolver ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋Œ€ํ™” ์ƒ์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฃผ์˜ : ๋ฃจํŠธ์— ์ œ๊ณต๋œ ์‹ฑ๊ธ€ํ†ค ๋ชจ๋“ˆ ์€ ๊ธฐ๋ณธ ๋ชจ๋“ˆ ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ ๋งŒ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋ž˜์„œ ์ฒซ ๋ฒˆ์งธ ์†”๋ฃจ์…˜์„ ์ƒ๊ฐํ•ด ๋‚ด๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ ํ•˜์œ„ ๋ชจ๋“ˆ์— ๋Œ€ํ•ด ๋Œ€ํ™” ์ƒ์ž ์ƒ์„ฑ๊ธฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํ•˜์œ„ ๋ชจ๋“ˆ์€ ๊ฒฐ๊ตญ ํ•ด๋‹น ๋ชจ๋“ˆ์˜ ComponentFactoryResolver ๋ชจ๋‹ฌ์„ ์ƒ์„ฑํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋‹ค๋ฅธ entryComponents ๊ฐ€ ์žˆ๋Š” ๊ณต์œ  ๋ชจ๋“ˆ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

... ์ผ๋ฐ˜์ ์œผ๋กœ ์ง€์›๋˜๋Š” ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ผ๋ถ€ ์ƒˆ๋กœ์šด API + Ivy ์ง€์›) ... Jason์˜ ํ”„๋ ˆ์  ํ…Œ์ด์…˜์œผ๋กœ ์ธํ•ด http://www.youtube.com/watch?v=2wMQTxtpvoY&t=131m24s ... Angular 7.2 . .. ํ•˜์ง€๋งŒ ๋ฒ„์ „ 7.2๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์–ธ๊ธ‰๋˜์—ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

CDK ์˜ค๋ฒ„๋ ˆ์ด ์™€ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. CDK ์˜ค๋ฒ„๋ ˆ์ด ์œ„์— ๋นŒ๋“œ๋œ ๊ฐค๋Ÿฌ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ด ์žˆ์ง€๋งŒ ์ด ๋ฌธ์ œ ๋•Œ๋ฌธ์— ๋ฃจํŠธ ๋ชจ๋“ˆ์—์„œ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

BTW, ๋‚ด ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@MurhafSousli ... lol, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์˜๋„์  ์ธ ๊ฒƒ์ด๋ผ๊ณ  ๋‹ค์‹œ ๋งํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ 100๋ฒˆ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค... ๋ฃจํŠธ ์ธ์ ํ„ฐ๊ฐ€ ํ•˜๋‚˜ ์žˆ๊ณ  ์ง€์—ฐ ๋กœ๋“œ๋œ ๋ชจ๋“ˆ์€ ํ•œ ์ˆ˜์ค€ ๊นŠ์ด์ด๋ฏ€๋กœ ๋ฃจํŠธ ์ˆ˜์ค€์—์„œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๋Ÿฌ ๋ฒˆ ๋งํ–ˆ๋“ฏ์ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ํ•ด๋‹น ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ๋ชจ๋“ˆ ์ฐธ์กฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋„ ๋ชฉ๋ก์— ์ถ”๊ฐ€ ๐Ÿ˜„. ๋‚ด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜๋Š” ๋ชจ๋‹ฌ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ๊ณ  ์•ฑ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์ž˜๋ชป๋œ ๋””์ž์ธ์ด ๋  ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์•ฑ์— ๋กœ๋“œํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์ด ๋ชจ๋“  ๊ฒƒ์„ ์ฝ์€ ํ›„์— ์ถ”์ธกํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@msarica ๋Š” ์˜ค๋Š˜ ๋‚˜์—๊ฒŒ ๋Š๋ฆฌ๊ฒŒ ๋กœ๋“œ๋˜๋Š” ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ํŒ์—…์„ ์—ฌ๋Š” ๊ธ€๋กœ๋ฒŒ ์„œ๋น„์Šค๋ฅผ ํ™•์žฅํ•œ ๋‹ค์Œ, ๋Š๋ฆฌ๊ฒŒ ๋กœ๋“œ๋œ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒ์—…์„ ์—ด๋ฉด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ง€์ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ธ€๋กœ๋ฒŒ PopupService

@Injectable({ providedIn: 'root' })
export class PopupService {
  constructor(
    private injector: Injector,
    private overlay: Overlay,
  ) {}

  open<T = any>(component: ComponentType<T>) { ... }
}

ํŠน์ • ์„œ๋น„์Šค๋Š” MyFeatureModule ์—์„œ๋งŒ ์ง€์—ฐ ๋กœ๋“œ๋จ

@Injectable()
export class MyFeaturePopupService extends PopupService {}

๋Š๋ฆฌ๊ฒŒ ๋กœ๋“œ๋œ MyFeatureModule ์˜ ์ผ๋ถ€์ธ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์‚ฌ์šฉ

@Component({ ... })
export class MyFeatureComponent {
  constructor(
    private myFeaturePopupService: MyFeaturePopupService,
  ) {}

  openPopup() {
    this.myFeaturePopupService.open(MyFeaturePopupComponent);
  }
}

์ง€์—ฐ ๋กœ๋“œ ๋ชจ๋“ˆ์˜ ์ •์˜ ์˜ˆ

@NgModule({
  imports: [MyFeatureRoutingModule],
  declarations: [
    MyFeatureComponent,
    MyFeaturePopupComponent,
  ],
  entryComponents: [MyFeaturePopupComponent],
  providers: [MyFeaturePopupService],
})
export class MyFeatureModule {}

Angular 7์—์„œ ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์šฐ๋ฆฌ ์ฝ”๋“œ๋Š” Angular CDK์˜ Overlay ๋ฅผ ํ™œ์šฉํ•˜์ง€๋งŒ ๊ฐœ๋…์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค(์ด ์Šค๋ ˆ๋“œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์— ๋”ฐ๋ฅด๋ฉด ์šฐ๋ ค๋˜๋Š” ๊ฒƒ์€ Injector ์ž…๋‹ˆ๋‹ค).

... ์ผ๋ฐ˜์ ์œผ๋กœ ์ง€์›๋˜๋Š” ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ผ๋ถ€ ์ƒˆ๋กœ์šด API + Ivy ์ง€์›) ... Angular 7.2์—์„œ

... @mlc-mlapis ์ผ๋ฐ˜ ์ง€์› ์†”๋ฃจ์…˜์ด ๋ฌด์—‡์ธ์ง€ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@cedvdb ... ์‹ค์ œ๋กœ ์†”๋ฃจ์…˜์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ํ”„๋ ˆ์  ํ…Œ์ด์…˜์—์„œ ์ค‘์š”ํ•œ ์ˆœ๊ฐ„์„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ง€์—ฐ ๋กœ๋“œ๋œ ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•œ ๋‹ค์Œ ๊ตฌ์„ฑ ์š”์†Œ, ์ง€์‹œ๋ฌธ, ...

๊ทธ ๋ฐฉ๋ฒ•์€ ์˜ค๋Š˜๋‚ ์—๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ Angular CLI๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ผ์šฐํ„ฐ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋„ ํ•ญ์ƒ ํ•„์š”ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์™€. ์ด๊ฒƒ์€ ๋งค์šฐ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ผ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

@angular/cdk ํฌํ„ธ ๋ฐ ์˜ค๋ฒ„๋ ˆ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‚ด ์ž์‹ ์˜ ๋Œ€ํ™” ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค: https://stackblitz.com/edit/cdk-dialog-example-p1. ์ด ๋ฌธ์ œ๋„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

@CWSpear ๊ฐ€ ์–ธ๊ธ‰ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ๋ชจ๋“ˆ์—์„œ ์„œ๋น„์Šค๋ฅผ ํ™•์žฅํ•ด์•ผ ํ–ˆ๊ณ  ๊ทธ๊ฒŒ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์–ผ๋งˆ๋‚˜ ์ด์ƒํ•œ๊ฐ€!

์ด์— ๋Œ€ํ•œ ๋” ์šฐ์•„ํ•œ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด์— ๋Œ€ํ•œ ๋” ์šฐ์•„ํ•œ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์‹คํ—˜ํ•ด ์˜จ ๊ฒƒ์€ ๊ฒŒ์œผ๋ฅธ ๋ชจ๋“ˆ ์ˆ˜์ค€์—์„œ ์‹คํ–‰๊ธฐ ๋ž˜ํผ๋ฅผ ๋‹ค์‹œ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ž˜ํผ๊ฐ€ ์ƒ์„ฑ์ž์—์„œ ์ธ์ ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๊ณ  ์ด๋ฅผ ์‹ค์ œ ๋Ÿฐ์ฒ˜(๋ฃจํŠธ์—์„œ ์ฃผ์ž…๋จ)์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ•œ ์ค„ ์ˆ˜์ •์ž…๋‹ˆ๋‹ค. ์–ผ๋งˆ๋‚˜ ์•ˆ์ •์ ์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ,

@NgModule({
  declarations: [LazyRootComponent, LazyEntryComponent],
  entryComponents:[LazyEntryComponent],
  providers:[LauncherWrapper],  //<---- reprovision here 
  imports: [
    CommonModule,
    LazyModRoutingModule
  ]
})
export class LazyModModule { }
@Injectable()
export class LauncherWrapper {
    constructor(private injector: Injector,  private launcher:ActualLaucherClass) {
    }

๋‚ด ๋ฌธ์ œ๋Š” @Injectable({providedIn: 'root'}) ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. @Injectable({providedIn: MyModule}) ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๐Ÿ˜„

์„œ๋น„์Šค๊ฐ€ ์ง€์—ฐ ๋กœ๋“œ๋œ ๋ชจ๋“ˆ ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ์— ์•ก์„ธ์Šคํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Š” ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฃจํŠธ์—์„œ ์ œ๊ณต๋˜๋ฉด ๋ชจ๋“ˆ์ด ๋ฃจํŠธ ์ธ์ ํ„ฐ์—์„œ ์ผ์‹œ์ ์œผ๋กœ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@jmcclanahan ๋ฐ @dirkluijk ๋•๋ถ„์— ๋ช‡ ์‹œ๊ฐ„ ๋™์•ˆ ๋จธ๋ฆฌ๋ฅผ ๊ธ์ ์ด๋ฉฐ ๊ท€ํ•˜์˜ ์„ค๋ช…์ด ์ œ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์„ ์ฐพ๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
@angular/cdk๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? ์™œ์š” ?

ํŠน๋ณ„ํ•œ ๋Œ€์ฒด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•˜๊ณ  ComponentFactoryResolver ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์‚ฌ ์ฝ”๋“œ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ํ†ตํ•ฉํ•˜๋ ค๋Š” ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  ๋‚ด "ํ•ด๊ฒฐ์ฑ…"์ด ์žˆ์Šต๋‹ˆ๋‹ค. CoalescingComponentFactoryResolver . ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์•ฑ ๋ชจ๋“ˆ์—์„œ ์ œ๊ณตํ•˜๊ณ  ํ•ด๋‹น ์ƒ์„ฑ์ž์—์„œ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•˜๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

@NgModule({
 providers: [CoalescingComponentFactoryResolver]
})
class AppModule {
  constructor(coalescingResolver: CoalescingComponentFactoryResolver) {
    coalescingResolver.init();
  }
}

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ง€์—ฐ ๋กœ๋“œ ๋ชจ๋“ˆ์€ ์ด๋ฅผ ์ฃผ์ž…ํ•˜๊ณ  ์ž์ฒด ComponentFactoryResolver ์ธ์Šคํ„ด์Šค๋ฅผ ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ:

@NgModule({})
export class LazyModule {
  constructor(
    coalescingResolver: CoalescingComponentFactoryResolver,
    localResolver: ComponentFactoryResolver
  ) {
    coalescingResolver.registerResolver(localResolver);
  }
}

์ด ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์ง€์—ฐ ๋กœ๋“œ ๋ชจ๋“ˆ์˜ ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ง€์—ฐ ๋กœ๋“œ๋˜์ง€ ์•Š์€ ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

๋„ค, ๊ฝค ์‹ฌํ•œ ํ•ดํ‚น์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ ๋‹น์žฅ์€ Angular 7์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ์œ ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@CWSpear ์˜ ์†”๋ฃจ์…˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ œ๊ณต์ž ๋ฐฐ์—ด์— ๊ธฐ์กด PopupService๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ„๋„์˜ "๊ธฐ๋Šฅ๋ณ„" PopupService๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด:

@Component({
  ...
  providers: [PopupService]  //<---- generic PopupService
})
export class MedicationPortletComponent implements OnInit, OnDestroy {
...

๋˜๋Š” ์ง€์—ฐ ๋กœ๋“œ ๋ชจ๋“ˆ์˜ NgModule์˜ ์ œ๊ณต์ž ๋ฐฐ์—ด์— PopupService๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ:

@NgModule({
  declarations: [
    ...
  ],
  imports: [
    ...
  ],
  providers: [PopupService] //<--- here's the PopupService!
})
export class SharedFeaturePatientModule {}

@jonrimmer ์ตœ๊ณ ์˜ ์†”๋ฃจ์…˜

@jonrimmer ์ด๊ฒƒ์€ ์ตœ์†Œํ•œ์˜ ๋ฐฉํ•ด๊ฐ€ ๋˜๋ฉฐ ์šฐ๋ฆฌ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ €์™€ ์ €ํฌ ํŒ€์—๊ฒŒ ํฐ ๊ฐ์‚ฌ๋ฅผ ๋“œ๋ฆฝ๋‹ˆ๋‹ค :)

๊ฒŒ์œผ๋ฅธ ๋ผ์šฐํ„ฐ์˜ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ์›ํ™œํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•˜์ง€๋งŒ ๊ฒŒ์œผ๋ฅธ ๊ฒฝ๋กœ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ngModuleFactoryLoader๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜๋™์œผ๋กœ ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

//Ignore the syntax
CompA {
  openDialog() {//invoked on button click of this comp
    matDialog.open(FilterComponent);//works fine in case of lazy route but throws error when manually loaded
  }
}

ModuleA {//lazy module
  imports: [MatDialog, FilterModule],
  declaration: [CompA]
}

FilterModule {
  declaration: [FilterComponent],
  entryComponent: [FilterComponent]
}

FilterComponent { ...
}

@jmcclanahan @MartinJHItInstituttet @splincode

async showBar() {
    const module = await import("../bar/bar.module");
    const compiled = this._compiler.compileModuleAndAllComponentsSync(
      module.BarModule
    );
    compiled.ngModuleFactory.create(this._injector);

    let factory: any = compiled.componentFactories.find(
      componentFactory => componentFactory.selector === "app-dialog"
    );
    this.modal.show(factory.componentType);
  }

@Jimmysh JIT ๋ชจ๋“œ์šฉ์ž…๋‹ˆ๋‹ค. AOT ๋ชจ๋“œ์—์„œ๋Š” import("../bar/bar.module.ngfactory") ๋ฅผ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค( compileModuleAndAllComponentsSync ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ).

@mlc-mlapis
https://github.com/angular/angular/blob/master/aio/src/app/custom-elements/elements-loader.ts ์—์„œ ํฌ๊ฒŒ ์˜๊ฐ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

https://github.com/Jimmysh/ng-lazy-component-load

AOT JIT๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋ฅผ ์œ„ํ•œ ์„ฑ๊ณต.

import { InjectionToken, Type } from '@angular/core';
import { LoadChildrenCallback } from '@angular/router';

export const ELEMENT_MODULE_LOAD_CALLBACKS_AS_ROUTES = [
  {
    path: 'aio-foo',
    loadChildren: () => import('../foo/foo.module').then(mod => mod.FooModule)
  }
];

export interface WithCustomElementComponent {
  customElementComponent: Type<any>;
}

export const ELEMENT_MODULE_LOAD_CALLBACKS_TOKEN = new InjectionToken<Map<string, LoadChildrenCallback>>(
  'aio/elements-map'
);

export const ELEMENT_MODULE_LOAD_CALLBACKS = new Map<string, LoadChildrenCallback>();
ELEMENT_MODULE_LOAD_CALLBACKS_AS_ROUTES.forEach(route => {
  ELEMENT_MODULE_LOAD_CALLBACKS.set(route.path, route.loadChildren);
});

```ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ
import { Compiler, Inject, Injectable, NgModuleFactory, NgModuleRef, Type, ComponentFactory } from '@angular/core';
'@angular/router'์—์„œ { LoadChildrenCallback } ๊ฐ€์ ธ์˜ค๊ธฐ;

'./lazy-component-registry'์—์„œ { ELEMENT_MODULE_LOAD_CALLBACKS_TOKEN } ๊ฐ€์ ธ์˜ค๊ธฐ;

@์ฃผ์‚ฌ๊ฐ€๋Šฅ({
์ œ๊ณต๋จ: '๋ฃจํŠธ'
})
๋‚ด๋ณด๋‚ด๊ธฐ ํด๋ž˜์Šค LazyComponentLoader {
private moduleToLoad: ์ง€๋„;
private moduleLoading = ์ƒˆ ์ง€๋„>();

๊ฑด์„ค์ž(
๊ฐœ์ธ moduleRef: NgModuleRef,
@Inject(ELEMENT_MODULE_LOAD_CALLBACKS_TOKEN) elementModulePaths: ์ง€๋„,
๊ฐœ์ธ ์ปดํŒŒ์ผ๋Ÿฌ: ์ปดํŒŒ์ผ๋Ÿฌ
) {
this.modulesToLoad = ์ƒˆ๋กœ์šด ์ง€๋„(elementModulePaths);
}

load(๊ฒฝ๋กœ: ๋ฌธ์ž์—ด, ์„ ํƒ์ž?: ๋ฌธ์ž์—ด): ์•ฝ์†{
if (this.modulesLoading.has(๊ฒฝ๋กœ)) {
๋ฐ˜ํ™˜ this.modulesLoading.get(๊ฒฝ๋กœ);
}

if (this.modulesToLoad.has(path)) {
  const modulePathLoader = this.modulesToLoad.get(path);
  const loadedAndRegistered = (modulePathLoader() as Promise<NgModuleFactory<any> | Type<any>>)
    .then(elementModuleOrFactory => {
      if (elementModuleOrFactory instanceof NgModuleFactory) {
        return elementModuleOrFactory;
      } else {
        return this.compiler.compileModuleAsync(elementModuleOrFactory);
      }
    })
    .then(elementModuleFactory => {
      const elementModuleRef = elementModuleFactory.create(this.moduleRef.injector);
      const factories: Map<any, ComponentFactory<any>> = (elementModuleRef.componentFactoryResolver as any)
        ._factories;
      if (selector) {
        const find = Array.from(factories.keys()).find(type => {
          const factory = factories.get(type);
          return factory.selector === selector;
        });
        if (find) {
          return find;
        } else {
          return Promise.reject(new Error(`not found selector:${selector}`));
        }
      }
      this.modulesToLoad.delete(path);
      return;
    })
    .catch(err => {
      this.modulesLoading.delete(path);
      return Promise.reject(err);
    });
  this.modulesLoading.set(path, loadedAndRegistered);
  return loadedAndRegistered;
}
return Promise.resolve();

}
}

``` typescript
  async showFoo() {
    await this.lazyComponentLoader.load('aio-foo');
    this.modal.show(FooDialogComponent);
  }
  async showFoo2() {
      const aaa = await this.lazyComponentLoader.load('aio-foo', 'app-dialog');
    this.modal.show(aaa);
  }

@Jimmysh ... ๊ทธ๋Ÿฌ๋ฉด ๋งž์Šต๋‹ˆ๋‹ค. JIT ๋ชจ๋“œ์—์„œ๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

constructor(private compiler: Compiler) {}
...
if (elementModuleOrFactory instanceof NgModuleFactory) {
   return elementModuleOrFactory;
} else {
   return this.compiler.compileModuleAsync(elementModuleOrFactory);
}

@mlc-mlapis AOT๋Š” NgModuleFactory๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. https://github.com/Jimmysh/ng-lazy-component-load ๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋ ˆํฌ ๋งํฌ: https://github.com/Jonathan002/route-master-example
๋ฐ๋ชจ URL: https://jonathan002.github.io/route-master-example/

FWIW, @CWSpear ๋ฐ @dirkluijk ์™€ ์œ ์‚ฌํ•œ ๋งฅ๋ฝ์—์„œ ๋‚ด ์„œ๋น„์Šค์—์„œ providedIn: 'root' ๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค(์ง€์—ฐ ๋กœ๋“œ ๋ชจ๋“ˆ์— ์ •์˜๋˜์–ด ์žˆ๊ณ  entryComponent ์—ฌ๋Š” ์ฑ…์ž„์ด ์žˆ์Œ). ๋Œ€์‹  ์„œ๋น„์Šค๋ฅผ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ง€์—ฐ ๋ชจ๋“ˆ ์ •์˜์˜ providers ์—์„œ. ์ด ์„œ๋น„์Šค์˜ ๊ฐ€์žฅ ํฐ/์œ ์ผํ•œ ๋‹จ์ ์€ ์„œ๋น„์Šค๊ฐ€ ๋” ์ด์ƒ ๋‚˜๋ฌด๋ฅผ ํ”๋“ค ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

providedIn: MyLazyModule ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ˆœํ™˜ ์ข…์†์„ฑ ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

@jonrimmer ๊ฐ์‚ฌํ•˜์ง€ ์•Š๊ณ  ๊ธ€์„ ๋‚จ๊ธธ ์ˆ˜๊ฐ€ ์—†์—ˆ์–ด์š”!! ๋‹น์‹ ์€ ๋‚ด ํ•˜๋ฃจ๋ฅผ ์ €์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‚ด ์˜๊ฒฌ์„ ์ฝ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ์ด ๋ฉ‹์ง„ ๋‹ต๋ณ€ ์„ ๋ณด๋ฉด ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜์ง€ ์•Š๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Angular 8.2.0์—์„œ ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Œ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. OP๊ฐ€ ๋งŒ๋“ค์–ด์ง„ ์ง€ 2.5๋…„์ด ๋œ ์ด๋ž˜๋กœ Angular์˜ ํ’๊ฒฝ์€ ๋งŽ์ด ๋ฐ”๋€Œ์—ˆ๊ณ  Angular Material 2๋Š” Angular Components๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ฃผ์„๊ฐ€๋“ค์ด ์ง€์ ํ•œ ๋ฐ”์™€ ๊ฐ™์ด Angular Material์€ DOM์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋Š๋ฆฌ๊ฒŒ ๋กœ๋“œ๋œ ํ•˜์œ„ ๋ชจ๋“ˆ์˜ entryComponents์— ์„ ์–ธ๋œ ๊ฒฝ์šฐ์—๋„ MatDialog์—์„œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋กœ๋“œํ•  ๋•Œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ์ž๊ฐ€ DOM์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋น„์ฆˆ๋‹ˆ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋™์ผํ•œ DOM ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ Angular์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€์นจ์— ๋ฐ˜ํ•ด ์ด์ƒํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

ComponentFactoryResolver ๊ฐ€ ์ง€์—ฐ ๋กœ๋“œ๋œ ํ•˜์œ„ ๋ชจ๋“ˆ์— ์„ ์–ธ๋œ ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์–ด๋–ค ์‹์œผ๋กœ๋“  "๋ณผ" ์ˆ˜ ์žˆ๋„๋ก OP์˜ ๊ธฐ๋Šฅ ์š”์ฒญ์„ ๊ตฌํ˜„ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. app.module์—์„œ ์ง€์—ฐ ๋ชจ๋“ˆ์˜ ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์€ ์ž‘๋™ํ•˜์ง€๋งŒ ๋ณด๊ธฐ ํ‰ํ•ฉ๋‹ˆ๋‹ค.

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋”๋Ÿฌ์šด ์ž‘์—… ์†”๋ฃจ์…˜: 1. DOM, 2. app.module์—์„œ ๊ตฌ์„ฑ ์š”์†Œ ์„ ์–ธ, ์•„๋ž˜์—์„œ ๋œ ๋”๋Ÿฌ์šด ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์„ธ ๋ฒˆ์งธ ์†”๋ฃจ์…˜, ๋œ ๋”๋Ÿฝ์Šต๋‹ˆ๋‹ค.

์ง€์—ฐ ๋กœ๋“œ๋œ ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ณต์œ  ์„œ๋น„์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

export interface DataComponent {
    data: any;
}

/**
 * Display an NG component in a dialog, and this dialog has not need to answer but close.
 */
@Injectable()
export class DataComponentDialogService {
    modalRef: MatDialogRef<DataComponentDialog>;

    constructor(private dialog: MatDialog) { }

    open(title: string, externalComponentType: Type<DataComponent>, componentData: any, autofocus = true): Observable<any> {
        const isSmallScreen = window.innerWidth < 640 || window.innerHeight < 640;
        this.modalRef = this.dialog.open(DataComponentDialog,
            {
                disableClose: true,
                minWidth: isSmallScreen ? '98vw' : undefined,
                autoFocus: autofocus,
                data: {
                    title: title,
                    externalComponentType: externalComponentType,
                    componentData: componentData,
                    isSmallScreen: isSmallScreen
                }
            });

        return this.modalRef.afterClosed();

    }

}

์ด ์„œ๋น„์Šค๋Š” ์ง€์—ฐ ๋กœ๋“œ๋˜์ง€ ์•Š์€ ๋ชจ๋“ˆ์˜ ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€์—ฐ ๋กœ๋“œ๋œ ์ผ๋ถ€ ๋ชจ๋“ˆ์— ๊ตฌํ˜„๋œ ์ผ๋ถ€ ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ ์ง€์—ฐ ๋ชจ๋“ˆ์—์„œ ์ œ๊ณตํ•  ์ด ์„œ๋น„์Šค์˜ ํด๋ž˜์Šค๋ฅผ ํŒŒ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

import { DataComponentDialogService } from '../_ui_services/dataComponentDialog.component';

@Injectable()
export class LazyComponentDialogService extends DataComponentDialogService {
    constructor(dialog: MatDialog) {
        super(dialog);
    }
}

LazyComponentDialogService๋Š” lazy entry ์ปดํฌ๋„ŒํŠธ์™€ ๋™์ผํ•œ lazy ๋ชจ๋“ˆ์—์„œ ์ œ๊ณต๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์•ฑ ์•„ํ‚คํ…์ฒ˜์— ๋”ฐ๋ผ ํŒŒ์ƒ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ ๋ชจ๋“ˆ์—์„œ DataComponentDialogService ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์ œ๊ณตํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์•„์ด๋น„ ๊ตฌํ˜„(9.0.0-next.7์—์„œ ํ…Œ์ŠคํŠธ)์œผ๋กœ ์ธํ•ด Angular 9์—๋Š” ๋” ์ด์ƒ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ง€์—ฐ ๋ชจ๋“ˆ ์™ธ๋ถ€์—์„œ ์ง€์—ฐ ๋กœ๋“œ๋œ ๋ชจ๋“ˆ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋™์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ด๋น„์—์„œ ๋™์ ์ธ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•ด์„œ๋Š” ์—”ํŠธ๋ฆฌ ์ปดํฌ๋„ŒํŠธ ์„ ์–ธ์ด ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. Ivy๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ƒ์„ฑ๋˜์—ˆ๋˜ ๋ถ„๋ฆฌ๋œ ์ปดํฌ๋„ŒํŠธ ํŒฉํ† ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ ๊ณต์žฅ ์ •๋ณด๋Š” Ivy(?)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ์š”์†Œ ์ •์˜์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ ์œ ํ˜•์ด ์žˆ์œผ๋ฉด ๊ตฌ์„ฑ ์š”์†Œ ํŒฉํ† ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๋‚ด ์ธ์ƒ์ž…๋‹ˆ๋‹ค. ํ•œ ์•Œ์˜ ์†Œ๊ธˆ์œผ๋กœ ๋‚ด ๋ง์„ ๋ฐ›์•„

๋ชจ๋“  ๋™์  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์„ ์–ธํ•˜๊ณ  ์ด๋ฅผ entryComponent๋กœ ํฌํ•จํ•˜๋Š” ๋ณ„๋„์˜ ์œ„์ ฏ ๋ชจ๋“ˆ์„ ์ƒ์„ฑํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ AppModule์—์„œ ์ด ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ž…๋ ฅ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ฃจํŠธ ์ธ์ ํ„ฐ์— ๋“ฑ๋ก๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์†”๋ฃจ์…˜์€ ๊นจ๋—ํ•˜๊ณ  Lazy ์บก์Šํ™”๋ฅผ ์ค‘๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@NgModule({
  declarations: [
    ModalComponent,
    ... more dynamic components ...
  ],
  entryComponents: [
     ModalComponent,
    ... more dynamic components ...
  ]
})
export class DynamicModule {

}

์•ฑ ๋ชจ๋“ˆ:

@NgModule({
   declarations: [
      AppComponent
   ],
   imports: [
      BrowserModule,
      AppRoutingModule,
      BrowserAnimationsModule,
      DynamicModule
   ],
   providers: [],
   bootstrap: [
      AppComponent
   ]
})
export class AppModule { }

@pixelbits-mk ๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  ๋™์  ๊ตฌ์„ฑ ์š”์†Œ(์˜ˆ: ๋ชจ๋‹ฌ ๋“ฑ)๊ฐ€ ์ฆ‰์‹œ ๋กœ๋“œ ๋˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ์š”์  ์€ ์•ฑ์˜ ์ดˆ๊ธฐ ๋กœ๋“œ ์†๋„๋ฅผ ๋Šฆ์ถ”์ง€ ์•Š๋„๋ก (ํŠนํžˆ ํ”„๋กœ์ ํŠธ๊ฐ€ ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ) ์ง€์—ฐ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ), ์ด๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ง€์—ฐ ๋กœ๋“œ๋œ ComponentA ์ด ์ง€์—ฐ ๋กœ๋“œ๋œ ๋™์  ComponentB ์„ ๋™์ ์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ComponentA ๊ฐ€ ComponentB ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ComponentAModule ComponentBModule ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด์ƒ์ ์ธ ๊ฒฝ์šฐ๋Š” ์•„๋‹ˆ์ง€๋งŒ, ๋‚˜๋Š” ๊ทธ๊ฒƒ์œผ๋กœ ์‚ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๋ฌธ์ œ๋Š” ComponentA ๊ฐ€ ComponentB ๊ฐ€ ๋กœ๋“œ๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ๋ชจ๋ฅผ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ComponentB ๊ฐ€ ๋ชจ๋‹ฌ์ด๊ณ  ComponentA ๊ฐ€ ์„œ๋น„์Šค์—์„œ showModal() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์„œ๋น„์Šค๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ComponentB ๋ฅผ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ ComponentA ๋Š” ๊ทธ๊ฒƒ์„ ๋ชจ๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ง€๊ธˆ ๋‚ด๊ฐ€ ํ•˜๋Š” ์ผ์€ ComponentB showModal(ComponentB) ComponentA ๊ฐ€ ComponentB ๋กœ๋“œ ๋˜์ง€๋งŒ ๋‚ด ์˜๊ฒฌ์œผ๋กœ๋Š” ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ๊ฐ ํ˜ธ์ถœ์€ ๊ตฌ์„ฑ ์š”์†Œ ์ฐธ์กฐ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•จ).

๋ชจ๋“ˆ์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ํ•„์š” ์—†์ด ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด(์ด ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค) ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค(Angular๋Š” ComponentA ๊ฐ€ ComponentB ์„ ๊ฐ€์ ธ์˜ค๋Š” ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ๊ฐ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ComponentAModule ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์•”์‹œ์ ์œผ๋กœ ComponentBModule ํ•˜๊ณ  ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ์˜จ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์€ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ์˜ ์ด์œ ๋Š” ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. , ๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ทน๋‹จ์  ์ธ ๊ฒฝ์šฐ๋กœ ๋ณผ ๊ฒƒ์ด๊ณ  ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

๋‚˜๋Š” (์•„์ง) @jonrimmer ์ œ์•ˆ ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ ์œ ๋งํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

ComponentA ๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ComponentA ๊ฐ€ ComponentB ๋กœ ๋ชจ๋“ˆ์„ ์ž๋™์œผ๋กœ ์ง€์—ฐ ๋กœ๋“œํ•˜๋ฉด ๊ต‰์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ModuleA ์—๋Š” ComponentA1 , ComponentA2 ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
ComponentA1 html ComponentB ์ฐธ์กฐ ( ๋ชจ๋“ˆ ModuleB ), ํ•˜์ง€๋งŒ ComponentA2 ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ModuleB ๋Š” ComponentA1 ๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ž๋™์œผ๋กœ ์ง€์—ฐ ๋กœ๋“œ๋˜์ง€๋งŒ ComponentA2 ๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํ™ˆ ํŽ˜์ด์ง€์˜ ๋Œ€์‹œ๋ณด๋“œ ์‹œ๋‚˜๋ฆฌ์˜ค์— ์™„๋ฒฝํ•˜๊ฒŒ ๋งž์Šต๋‹ˆ๋‹ค. Dahsboard๋Š” ๋‹ค์–‘ํ•œ ๋ชจ๋“ˆ์—์„œ ์ œ๊ณต๋˜์ง€๋งŒ ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ โ€‹โ€‹ํฌํ•จ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ(์˜ˆ: ์‚ฌ์šฉ์ž ์„ค์ •์„ ํ†ตํ•ด) ํ•ด๋‹น ๋ชจ๋“ˆ์„ ๋‹ค์šด๋กœ๋“œํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@jonrimmer ๋ฉ”์ธ ComponentFactoryResolver์˜ resolveComponentFactory ํ•จ์ˆ˜๋ฅผ ๋ž˜ํ•‘ํ•˜๊ณ  ์ด์ „์— ๋“ฑ๋ก๋œ ์ง€์—ฐ ๋กœ๋“œ ๋ชจ๋“ˆ์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ข‹์€ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค.

๋ฃจํŠธ์—์„œ ์ œ๊ณต๋˜๋Š” ์„œ๋น„์Šค๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€์—ฐ ๋กœ๋“œ ๋ชจ๋“ˆ์—์„œ๋งŒ ์ œ๊ณต๋˜๋Š” ์„œ๋น„์Šค๋Š” ์ฃผ์ž…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ StaticInjectorError๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ํ™•์ธํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

ivy๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์˜ค๋Š˜ ์ด ๋ฌธ์ œ๋ฅผ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ–ˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์—๋Š” ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ์™€ ๊ณต์œ  ์„œ๋น„์Šค๋ฅผ ํฌํ•จํ•˜๋Š” ์ง€์—ฐ ๋กœ๋“œ๋กœ ๋ชจ๋“ˆ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์—ฌ ๊ตฌ์„ฑ ์š”์†Œ ํŒฉํ† ๋ฆฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ์ƒˆ๋กœ์šด ์˜ค๋ฅ˜๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋งŒ ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ฒ˜์Œ์— ์ด๊ฒŒ ๋ฌธ์ œ์˜€๋‹ค๋Š” ๊ฑธ ์ฝ๊ณ  ์ถฉ๊ฒฉ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ๊ธฐ์กด Angular 8.2 ํ”„๋กœ์ ํŠธ์—์„œ ivy๋ฅผ ํ™œ์„ฑํ™”ํ–ˆ๊ณ  ๋ชจ๋‘ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ง€์—ฐ ๋กœ๋“œ ๋ชจ๋“ˆ์—์„œ Overlay ์‚ฌ์šฉ์„ ์œ„ํ•œ ๋‚ด ์†”๋ฃจ์…˜:
๋‹ค์Œ๊ณผ ๊ฐ™์ด ComponentPortal ์˜ ์ƒ์„ฑ์ž์—๊ฒŒ ํŒฉํ† ๋ฆฌ ๋ฆฌ์กธ๋ฒ„๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@Injectable()
export class OverlayService {

  constructor(
    private overlay: Overlay,
    private componentFactoryResolver: ComponentFactoryResolver
  ) {
  }

  open<T>(component: ComponentType<T>) {
    const overlayRef = this.overlay.create();

    const filePreviewPortal = new ComponentPortal(component, null, null, this.componentFactoryResolver);

    overlayRef.attach(filePreviewPortal);
  }
}

๊ทธ๋Ÿฌ๋‚˜ ์ง€์—ฐ ๋กœ๋“œ๋œ ๋ชจ๋“ˆ์—์„œ๋„ OverlayService ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. OverlayService๋Š” OverlayService๊ฐ€ ์ œ๊ณต๋˜๋Š” ๋ชจ๋“ˆ์˜ ComponentFactoryResolver ๋ฅผ ์ฃผ์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@NgModule({
  declarations: [
     SomeComponent,
  ],
  entryComponents: [
    SomeComponent,  // <-------- will be opened via this.overlayService.open(SomeComponent)
  ],
  providers: [
    OverlayService, // <--------
  ]
})
export class LazyLoadedModule {}

@mixrich ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ [๋‚ด ์•ฑ์—์„œ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋กœ๊ทธ์•„์›ƒ๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์ด๋ฒคํŠธ์—์„œ ๋ชจ๋“  ๋ชจ๋‹ฌ ๋Œ€ํ™” ์ƒ์ž๋ฅผ ๋‹ซ์•„์•ผ ํ•  ๋•Œ๊นŒ์ง€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.] ์ด ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ฆ‰, ์•ฑ์—๋Š” ์˜ˆ์ „ ์„œ๋น„์Šค์™€ ๊ฐ™์€ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์˜ค๋ฒ„๋ ˆ์ด ์„œ๋น„์Šค์˜ ์‹ ํ˜ธ ํ†ค์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ชจ๋‹ฌ ๋Œ€ํ™” ์ƒ์ž๊ฐ€ ์—ด๋ ค ์žˆ๋Š”์ง€ ์•Œ๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์•ฑ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์ด์ง€๋งŒ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์— ์ฃผ์˜ํ•  ๋ฟ์ž…๋‹ˆ๋‹ค.

@mixrich ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ [๋‚ด ์•ฑ์—์„œ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋กœ๊ทธ์•„์›ƒ๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์ด๋ฒคํŠธ์—์„œ ๋ชจ๋“  ๋ชจ๋‹ฌ ๋Œ€ํ™” ์ƒ์ž๋ฅผ ๋‹ซ์•„์•ผ ํ•  ๋•Œ๊นŒ์ง€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.] ์ด ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ฆ‰, ์•ฑ์—๋Š” ์˜ˆ์ „ ์„œ๋น„์Šค์™€ ๊ฐ™์€ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์˜ค๋ฒ„๋ ˆ์ด ์„œ๋น„์Šค์˜ ์‹ ํ˜ธ ํ†ค์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ชจ๋‹ฌ ๋Œ€ํ™” ์ƒ์ž๊ฐ€ ์—ด๋ ค ์žˆ๋Š”์ง€ ์•Œ๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์•ฑ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์ด์ง€๋งŒ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์— ์ฃผ์˜ํ•  ๋ฟ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ œ ๊ฒฝ์šฐ์—๋Š” OverlayService๊ฐ€ ์ œ๊ณต๋œ OverlayService ModalDialogModule ์ด ์žˆ๊ณ  OverlayService.open(SomeComponent) ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ชจ๋‹ฌ ์ฐฝ ํ…œํ”Œ๋ฆฟ๋„ ์ƒ์„ฑ๋˜๊ณ  ๋‚ด๋ถ€์— SomeComponent ๊ฐ€ ์‚ฝ์ž…๋ฉ๋‹ˆ๋‹ค. ์œ ์šฉํ•œ ๊ด€์ฐฐ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ(๋‹ซ๊ธฐ ๋ฐ ์„ฑ๊ณต ์ด๋ฒคํŠธ์˜ ๊ฒฝ์šฐ), ๊ตฌ์„ฑ ์š”์†Œ ์ธ์Šคํ„ด์Šค ๋ฐ ์ˆ˜๋™ close ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ LazyModule์—์„œ ๋ชจ๋‹ฌ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ OverlayService ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ModalDialogModule ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋‹ฌ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ModalDialogModule ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ•ญ์ƒ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ ‘๊ทผ ๋ฐฉ์‹์ด ํŽธ๋ฆฌํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๋ฐ˜์‘ ์–‘์‹์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ReactiveFormModule ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ•ญ์ƒ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ

Angular 8.3.6์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชจ๋“ˆ ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋กœ๋“œ๋˜์ง€ ์•Š๋Š” ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ(๋งคํŠธ ๋Œ€ํ™” ์ƒ์ž)๊ฐ€ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชจ๋“ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ด๋ ค๊ณ  ํ–ˆ์„ ๋•Œ ์ฝ˜์†” ๋กœ๊ทธ์—์„œ MyCustomDialog์— ๋Œ€ํ•œ ๊ตฌ์„ฑ ์š”์†Œ ํŒฉํ† ๋ฆฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๊ณ  ๋‚˜์˜ต๋‹ˆ๋‹ค.

์†”๋ฃจ์…˜์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชจ๋“ˆ์˜ NgModule ํด๋ž˜์Šค์—์„œ ๋ชจ๋“  ๋ชจ๋“ˆ์˜ ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์•ฑ ๋ชจ๋“ˆ NgModule์—์„œ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

@NgModule({
    declarations: [
        MyCustomDialogComponent
    ],
    imports: [
        CommonModule
    ],
    exports: [
        MyCustomDialogComponent
    ]
    // no need to add the dialog component to entryComponents here.
})
export class MyCustomModule {
    static getEntryComponents() {
        const entryComponents = [];
        entryComponents.push(MyCustomDialogComponent);
        return entryComponents;
    }
}

import {MyCustomModule} from 'my-custom-library'; // import library from node_modules

@NgModule({
    declarations: [
        AppComponent
    ],
    imports: [
        BrowserModule,
        AppRoutingModule,
        BrowserAnimationsModule,
        MyCustomModule
    ],
    providers: [],
    bootstrap: [AppComponent],
    entryComponents: [].concat(MyCustomModule.getEntryComponents())
})
export class AppModule {
}

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

@asmith2306 ์™œ ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๋ชป์ƒ๊ฒผ์–ด

@asmith2306 ์™œ ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๋ชป์ƒ๊ฒผ์–ด

์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์–ด๋”˜๊ฐ€์— ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

--prod ๋ชจ๋“œ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ž‘๋™ํ•˜๋”๋ผ๋„ ์‹ค์ œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” NgModule์˜ entryComponents์— ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ•ด๋‹น ๋ชจ๋“ˆ์„ ๋‚ด ์•ฑ์—์„œ ๋Š๋ฆฌ๊ฒŒ ๋กœ๋“œ๋œ ๋ชจ๋“ˆ๋กœ ๊ฐ€์ ธ์˜ค๋ฉด entryComponents๊ฐ€ ์•ฑ ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ์— ์ž๋™์œผ๋กœ ๋“ฑ๋ก๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ์ด์ƒ์˜ ์ž‘์—…์ด ํ•„์š”ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. NgModule์˜ entryComponents์— ์žˆ๋Š” ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์•ฑ ๋ชจ๋“ˆ์˜ entryComponents์— ์ž๋™์œผ๋กœ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์— ์žˆ์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@broweratcognitecdotcom ๋‹ค์–‘ํ•œ ์ฃผ์ž… ์ˆ˜์ค€์˜ ์ถฉ๋Œ ๋ฐ ์šฐ์„  ์ˆœ์œ„๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

@mlc-mlapis ์ฃผ๋ฌธ์€ ์„ ์ฐฉ์ˆœ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@mlc-mlapis ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ด๋ฆ„์ด ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ์ฒซ ๋ฒˆ์งธ ์ผ์น˜ ํ•ญ๋ชฉ ๋˜๋Š” ์ผ์น˜ ํ•ญ๋ชฉ์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ ์ด๋ฆ„์ด ๊ณ ์œ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ƒํ™œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@broweratcognitecdotcom ๋„ค ์•ˆ๋…•ํ•˜์„ธ์š”. ์ผ๋ฐ˜ ์›์น™์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋ ค๋ฉด ๋ชจ๋“  ๋ณ€ํ˜•์„ ๋‹ค๋ฃจ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@mlc-mlapis ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ทน๋ณตํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ๊ฐ๋„์˜ ํ•œ๊ณ„๋Š” ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ธ์Šคํ„ด์Šคํ™”๋˜๊ณ  ์•ฑ์— ์˜ํ•ด์„œ๋งŒ dom์— ๋ฐฐ์น˜๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ฑ์€ ๋‚ด๊ฐ€ ์ง€์—ฐ ๋กœ๋“œ๋œ ๋ชจ๋“ˆ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋ชจ๋“ˆ์ด ์‚ฌ์šฉํ•˜๋Š” ๋Œ€ํ™” ์ƒ์ž์— ๋Œ€ํ•ด ์•Œ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•ญ๋ชฉ ๊ตฌ์„ฑ ์š”์†Œ์˜ ํ˜„์žฌ ๊ฐœ๋…์€ ๊ฐ๋„์˜ ๋ชจ๋“ˆ์‹ ํŒจํ„ด์„ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค.

Ivy entryComponents๊ฐ€ ์žˆ๋Š” AFAIK๋Š” ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งž์ฃ ? ๊ตฌ์„ฑ ์š”์†Œ์—๋Š” ์ง€์—ญ์„ฑ์ด ์žˆ์œผ๋ฏ€๋กœ ๋™์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ๋งŒ ํ•˜๋ฉด ํ•ญ์ƒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

@Airblader ๋‹น์‹ ์ด ์˜ณ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์—ญ์‚ฌ์— ๋Œ€ํ•œ ์ž‘์€ ํšŒ์ƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜„

์—ฌ์ „ํžˆ ์ด ๋ฌธ์ œ๋กœ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๋Š” ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/angular/angular/issues/14324#issuecomment -481898762

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํŒจํ‚ค์ง€๋ฅผ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค. jonrimmer์˜ ์ผ๋ถ€ ์ฝ”๋“œ ์‚ฌ๋ณธ.
Angular 9์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ง€๊ธˆ ์ˆ˜์ •ํ•˜์„ธ์š”. @aiao/lazy-component ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์— ์ƒ˜ํ”Œ ์ฝ”๋“œ
https://github.com/aiao-io/aiao/tree/master/integration/lazy-component

๋‚˜๋Š” ์ด๊ฒƒ์ด ์•„์ด๋น„๋ฅผ ์‹คํ–‰ํ•˜๋Š” Angular v9์—์„œ ์ˆ˜์ •๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์œ ์‚ฌํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ์ตœ์†Œํ•œ์˜ ์žฌํ˜„ ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ฌ์‹ญ์‹œ์˜ค. ์”ฝํฌ์Šค!

์ด ๋ฌธ์ œ๋Š” ํ™œ๋™์ด ์—†์–ด ์ž๋™์œผ๋กœ ์ž ๊ฒผ์Šต๋‹ˆ๋‹ค.
์œ ์‚ฌํ•˜๊ฑฐ๋‚˜ ๊ด€๋ จ๋œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ƒˆ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜์‹ญ์‹œ์˜ค.

์ž๋™ ๋Œ€ํ™” ์ž ๊ธˆ ์ •์ฑ… ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”.

_์ด ์ž‘์—…์€ ๋ด‡์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค._

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