Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

136
Visualizações
Crear dinámicamente componentes de otros módulos

Necesito un servicio de apertura modal global que pueda crear componentes dinámicos desde cualquier módulo. Tengo varios módulos y cada uno de ellos tiene componentes modales. He simplificado la estructura de mi proyecto así:

 AppModule ---ModalOpenerService --ModalTemplate ---AModule ---ModalComponent1 ---ModalComponent2 ---SimpleComponent ---BModule ---ModalComponent3 ---ModalComponent4

El servicio de apertura modal tiene un método como este:

 @ViewChild('modalContainer', {read: ViewContainerRef}) modalContainer; showModal(component: Type<any>,data?:any){ let componentFactory = this.resolver.resolveComponentFactory(component); this.modalContainer.createComponent(componentFactory ); }

Quiero que mi ModalOpenerService pueda crear cualquier componente modal y mostrarlo. Pero el problema es que los componentes modales pertenecen a diferentes módulos y el abridor modal no puede encontrarlos en la lista de fábrica de componentes de su inyector.

 No component factory found for ModalComponent1. Did you add it to @NgModule.entryComponents

Obviamente, ModalComponent1 no es miembro de AppModule.

Podría abrir modales pasando el método de fábrica como parámetro en lugar del tipo de componente como este:

 //In SimpleComponent, I call my ModalOpenerService to open modal1. Because //the simpleComponent's parent injector (AModule's injector) can find Modal1, //this.resolver can resolve Modal1. showModal1(){ this.modalOpenerService.showModal(this.resolver.resolveComponentFactory(ModalComponent1)); }

En ModalOpenerService

 @ViewChild('modalContainer', {read: ViewContainerRef}) modalContainer; showModal(factory:ComponentFactory<any>, data?:any){ this.modalContainer.createComponent(factory); }

Por lo tanto, los módulos crean sus propios componentes y pueden encontrar el componente en su entryComponents de componentes de entrada.

Todavía tenemos un problema, porque cualquier componente modal creado en el alcance de AppModule y si quiero mostrar otro modal de un modal, el inyector de AppModule aún no podrá encontrarlo.

Una solución puede ser poner todos los modales en el mismo módulo con ModalOpenerService pero quiero todos los modales en su propio Módulo.

Cualquier sugerencia de diseño estructural también es bienvenida

about 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Debe tener ModalOpenerService como módulo separado como sea

 export class ModelModule { static WithComponents(components: Array<Type<any>>): Array<any> { return { ngModule: ModelModule, providers: [ { provide: ANALYZE_FOR_ENTRY_COMPONENTS, useValue: components, multi: true } ] } } }

Y desde AModule y BModule puede incluir un ModelModule como se muestra a continuación

 @NgModule({ imports: [BrowserModule, ModelModule.WithComponents([ModalComponent1, ModalComponent2])], declarations: [AppComponent, ModalComponent1, ModalComponent2], bootstrap: [AppComponent], providers: [] }) export class AModule { }
about 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda