Angolare 4: nessuna fabbrica di componenti trovata, l'hai aggiunta a @ NgModule.entryComponents?


300

Sto usando il modello Angular 4 con webpack e ho questo errore quando provo ad usare un componente (ConfirmComponent):

Nessuna fabbrica di componenti trovata per ConfirmComponent. L'hai aggiunto a @ NgModule.entryComponents?

Il componente è dichiarato in app.module.server.ts

@NgModule({
  bootstrap: [ AppComponent ],
  imports: [
    // ...
  ],
  entryComponents: [
    ConfirmComponent,
  ],
})
export class AppModule { }

Ho anche app.module.browser.tseapp.module.shared.ts

Come posso ripararlo?


1
Come stai usando ConfirmComponenti dettagli non sono sufficienti per rispondere alla tua domanda
Anik,

Ciao. Lo sto usando dopo aver inserito l'importazione del mio componente {ConfirmComponent} da "../confirm.component/confirm.component";
mrapi,


Se funzionerà come un componente comune, puoi inserirlo nelle dichiarazioni e nei componenti entry di CommonModule e rimuoverlo da altri luoghi.
Charitha Goonewardena,

1
Per Angular Dialog stesso errore e correzione! freakyjolly.com/…
Codice spia

Risposte:


438

Aggiungi questo nel tuo module.ts,

declarations: [
  AppComponent,
  ConfirmComponent
]

se ConfirmComponent si trova in un altro modulo, è necessario esportarlo lì in modo da poterlo utilizzare all'esterno, aggiungere:

exports: [ ConfirmComponent ]

--- Aggiorna Angular 9 o Angular 8 con Ivy esplicitamente abilitato ---

I componenti di entrata con Ivy non sono più necessari e ora sono obsoleti

--- per Angular 9 e 8 con Ivy disabilitato ---

Nel caso di un componente caricato dinamicamente e per generare un ComponentFactory, il componente deve essere aggiunto anche alla voce del modulo Componenti:

declarations: [
  AppComponent,
  ConfirmComponent
],
entryComponents: [ConfirmComponent],

secondo la definizione di entryComponents

Specifica un elenco di componenti che devono essere compilati quando viene definito questo modulo. Per ogni componente elencato qui, Angular creerà un ComponentFactory e lo memorizzerà nel ComponentFactoryResolver.


3
Hi.it è già in app.module.shared.ts e entryComponents è in app.module.server.ts
mrapi,

4
se ConfirmComponent si trova in un altro modulo, è necessario esportarlo lì in modo da poterlo utilizzare all'esterno, aggiungere: export: [ConfirmComponent] nella tua app.module.shared.ts
Fateh Mohamed,

1
è il componente ng2-bootstrap-modal da github.com/ankosoftware/ng2-bootstrap-modal/blob/master/…
mrapi,

9
Grazie a tutti voi. !!!!!!! .. mettendo tutte le dichiarazioni e entryComponents nello stesso file app.module.shared.ts risolto il problema
mrapi,

9
le esportazioni non funzionano ... opzione entryComponents che funziona per me!
Raja Rama Mohan Thavalam,

133

Vedi i dettagli su entryComponent:

Se si carica dinamicamente un componente, è necessario inserirlo in entrambi declarationse entryComponent:

@NgModule({
  imports: [...],
  exports: [...],
  entryComponents: [ConfirmComponent,..],
  declarations: [ConfirmComponent,...],
  providers: [...]
})

5
Grazie, GRAZIE !!! Stavo creando una finestra di dialogo per inserire i dati all'interno di un altro componente (La finestra di dialogo ha la relativa dichiarazione all'interno dell'altro componente e dialog.html per il layout)
Ramon Araujo,

3
Questo ha fatto il trucco per me e ha anche una spiegazione migliore della risposta scelta. Grazie!
Arsen Simonean,

2
Chiaramente la migliore risposta per me!
tuxy42,

Questa era la soluzione per me; Stavo creando un componente al volo e avevo tutto nei moduli corretti, ma continuavo a ricevere l'errore. L'aggiunta dei miei componenti creati è entryComponentsstata la soluzione - grazie!
Novastorm,

2
il mio componente che chiama ModalComponent è un nipote di un componente. Né l'aggiunta del ModalComponent per entryComponentsnon aggiungerlo alla exportsfunzionato per me. MA posso chiamare il componente modale da alcuni altri componenti che non sono nipoti
canbax,

55

TL; DR: Un servizio in NG6 con providedIn: "root"non riesce a trovare il ComponentFactory quando il componente non viene aggiunto nel entryComponentsdi app.module .

Questo problema può verificarsi anche se si utilizza l'angolo 6 in combinazione con la creazione dinamica di un componente in un servizio!

Ad esempio, creando un overlay:

@Injectable({
  providedIn: "root"
})
export class OverlayService {

  constructor(private _overlay: Overlay) {}

  openOverlay() {
    const overlayRef = this._createOverlay();
    const portal = new ComponentPortal(OverlayExampleComponent);

    overlayRef.attach(portal).instance;
  }
}

Il problema è il

fornitoIn: "root"

definizione, che fornisce questo servizio in app.module .

Pertanto, se il servizio si trova, ad esempio, nel "OverlayModule", in cui è stato dichiarato anche OverlayExampleComponent e aggiunto alla voceComponents, il servizio non è in grado di trovare ComponentFactory per OverlayExampleComponent.


3
Problema specifico di Angular 6. Risolvi il problema aggiungendo il componente a entryComponents in @NgModule @NgModule ({entryComponents: [yourComponentName]})
DeanB_Develop,

6
Questo può essere risolto rimuovendo providedIne invece usando l' providersopzione sul modulo.
Knelis,

Grazie per le informazioni, ma aggiungendo a @NgModule ({..., entryComponents: [...]}) ha funzionato per me anche con
fornitoIn

1
questo sembra correlato a github.com/angular/angular/issues/14324 sembra che sarà risolto in Angular 9
Paolo Sanchi

Esatto, specialmente nel modulo a caricamento lento. Per risolvere questo problema, ho specificato NgModule.providers: [MyLazyLoadedModuleService] e ho cambiato MyLazyLoadedModuleService.providedIn da "root" a MyLazyLoadedmodule.
Howard,

45

Ho avuto lo stesso problema. In questo caso imports [...]è fondamentale, perché non funzionerà se non si importa NgbModalModule.

La descrizione dell'errore dice che i componenti dovrebbero essere aggiunti entryComponentsall'array ed è ovvio, ma assicurati di averlo aggiunto in primo luogo:

imports: [
    ...
    NgbModalModule,
    ...
  ],

6
Mi hai salvato, evviva! Ciò è sicuramente necessario quando si tenta di aprire un componente in modalità modale. Il messaggio di errore è un po 'fuorviante in questa situazione.
beawolf,

Da dove lo importi?
Mdomin45,

Nel mio caso ho cambiato l'importazione di NbDialogModule in NbDialogModule.forChild (null),
Maayan Hope

@ Mdomin45 import {NgbModalModule} da "@ ng-bootstrap / ng-bootstrap";
mpatel,

24

Aggiungi quel componente a entryComponents in @NgModule del modulo della tua app:

entryComponents:[ConfirmComponent],

così come dichiarazioni:

declarations: [
    AppComponent,
    ConfirmComponent
]

Mi hai salvato la giornata! Saluti compagno
Sahan Serasinghe,

il mio componente che chiama ModalComponent è un nipote di un componente. Né l'aggiunta del ModalComponent per entryComponentsnon aggiungerlo alla exportsfunzionato per me. MA posso chiamare il componente modale da alcuni altri componenti che non sono nipoti
canbax,

14

Aggiungi 'NgbModalModule' nelle importazioni e il nome del tuo componente in entryComponents App.module.ts come mostrato di seguito inserisci qui la descrizione dell'immagine


il mio componente che chiama ModalComponent è un nipote di un componente. Né l'aggiunta del ModalComponent per entryComponentsnon aggiungerlo alla exportsfunzionato per me. MA posso chiamare il componente modale da alcuni altri componenti che non sono nipoti
canbax

Devo ripetere questa risposta, se il tuo componente è già stato aggiunto a entryComponents e il problema persiste, assicurati di controllare il componente modal che stai utilizzando e aggiungerlo nell'array delle importazioni! Questo mi ha salvato la vita!
Clyde,

10

Posizionare i componenti creati dinamicamente in entryComponents nella funzione @NgModuledecorator.

@NgModule({
    imports: [
        FormsModule,
        CommonModule,
        DashbaordRoutingModule
    ],
    declarations: [
        MainComponent,
        TestDialog
    ],
    entryComponents: [
        TestDialog
    ]
})

1
Sì, questo è stato molto utile - se hai detto una finestra di dialogo che non è stata presa da una rotta ma utilizzata in modo dinamico, deve essere aggiunta al entryComponentsrispettivo modulo ng che è stato dichiarato.
atconway

il mio componente che chiama ModalComponent è un nipote di un componente. Né l'aggiunta del ModalComponent per entryComponentsnon aggiungerlo alla exportsfunzionato per me. MA posso chiamare il componente modale da alcuni altri componenti che non sono nipoti
canbax,

10

Ho lo stesso problema con Angular 6, ecco cosa ha funzionato per me:

@NgModule({
...
entryComponents: [ConfirmComponent],
providers:[ConfirmService]

})

Se hai un servizio come ConfirmService , devi dichiararlo nei provider del modulo corrente anziché in root


8

Ho avuto lo stesso problema per il bootstrap modale

importare {NgbModal} da '@ ng-bootstrap / ng-bootstrap';

Se questo è il tuo caso, aggiungi il componente alle dichiarazioni del modulo e ai componenti entry come suggeriscono altre risposte, ma aggiungi anche questo al tuo modulo

importare {NgbModule} da '@ ng-bootstrap / ng-bootstrap';

imports: [
   NgbModule.forRoot(),
   ...
]

8

Questo errore si verifica quando si tenta di caricare un componente in modo dinamico e:

  1. Il componente che si desidera caricare non è il modulo di routing
  2. Il componente non è presente nel modulo entryComponents.

in routingModule

const routes: Routes = [{ path: 'confirm-component', component: ConfirmComponent,data: {}}]

o nel modulo

entryComponents: [
ConfirmComponent
} 

Per correggere questo errore è possibile aggiungere un router al componente o aggiungerlo a entryComponents del modulo.

  1. Aggiungi un router a component.drawback di questo approccio se il tuo componente sarà accessibile con quell'URL.
  2. Aggiungilo a entryComponents. in questo caso il tuo componente non avrà alcun URL collegato e non sarà accessibile con url.

8

Ho avuto lo stesso problema in Angular7 durante la creazione di componenti dinamici. Esistono due componenti (TreatListComponent, MyTreatComponent) che devono essere caricati in modo dinamico. Ho appena aggiunto l'array entryComponents al mio file app.module.ts.

    entryComponents: [
    TreatListComponent,
    MyTreatComponent
  ],

6

se usi il routing nella tua applicazione

assicurati di aggiungere nuovi componenti nel percorso di routing

per esempio :

    const appRoutes: Routes = [
  { path: '', component: LoginComponent },
  { path: 'home', component: HomeComponent },
  { path: 'fundList',      component: FundListComponent },
];

7
No, non credo che ogni componente dovrebbe essere in un percorso.
Mcanic,

Solo le pagine che si desidera visualizzare devono trovarsi nei percorsi. Una pagina può utilizzare / visualizzare più componenti
Thibaud Lacan,

ogni volta che non è necessario aggiungere componenti a Route, ad esempio modali. Posizionare i componenti creati dinamicamente in entryComponents nella funzione @NgModuledecorator.
CodeMind,

3

Nel mio caso non avevo affatto bisogno di entryComponents - solo la configurazione di base come descritto nel link seguente, ma dovevo includere l'importazione sia nel modulo principale dell'app che nel modulo allegato.

imports: [
    NgbModule.forRoot(),
    ...
]

https://medium.com/@sunilk/getting-started-angular-6-and-ng-bootstrap-4-4b314e015c1c

Devi solo aggiungerlo a entryComponents se un componente sarà incluso nel modale. Dai documenti:

È possibile passare un componente esistente come contenuto della finestra modale. In questo caso, ricorda di aggiungere un componente di contenuto come sezione entryComponents di NgModule.


error TS2339: Property 'forRoot' does not exist on type 'typeof NgbModule'.usando
angular

3

Stavo riscontrando lo stesso problema con ag-grid utilizzando componenti dinamici. Ho scoperto che è necessario aggiungere il componente dinamico al modulo ag-grid .withComponents []

importazioni: [StratoMaterialModule, BrowserModule, AppRoutingModule, HttpClientModule, BrowserAnimationsModule, NgbModule.forRoot (), FormsModule, ReactiveFormsModule, AppRoutingModule, AgGridModule.withComponents (ProjectUpdateButtonComponent) ],


3

Nel mio caso, ho dimenticato di aggiungere MatDialogModulealle importazioni in un modulo figlio.


2

Per chiarimenti qui. Nel caso in cui non si utilizzi ComponentFactoryResolverdirettamente nel componente e si desideri astrarlo per renderlo operativo, che viene quindi iniettato nel componente, è necessario caricarlo sotto i provider per quel modulo, poiché se il caricamento è lento non funzionerà.


2

Nel caso in cui tu abbia ancora l'errore dopo aver fornito la classe di dialogo del componente in entryComponents, prova a riavviare ng serve- ha funzionato per me.


2

Il mio errore stava chiamando il metodo aperto NgbModal con parametri errati da .html


2

Dovresti importare NgbModulenel modulo in questo modo:

@NgModule({
  declarations: [
    AboutModalComponent
  ],
  imports: [
    CommonModule,
    SharedModule,
    RouterModule,
    FormsModule,
    ReactiveFormsModule,
    NgxLoadingModule,
    NgbDatepickerModule,
    NgbModule
  ],
  entryComponents: [AboutModalComponent]
})
 export class HomeModule {}


Perfetto per questo fratello l'esempio url - hassantariqblog.wordpress.com/2017/02/12/…
Juan Ignacio Liska

1
  1. entryComponentsè vitale. Le risposte sopra riportate sono corrette.

Ma...

  1. Se stai fornendo un servizio che apre il modale (un modello comune) e il tuo modulo che definisce il componente della finestra di dialogo non viene caricato in AppModule, devi passare providedIn: 'root'a providedIn: MyModule. Come buona pratica generale dovresti semplicemente usare il providedIn: SomeModuleper tutti i servizi di dialogo che sono nei moduli.

0

Sto usando Angular8 e sto provando ad aprire il componente in modo dinamico da un altro modulo . In questo caso, devi import the moduleentrare nel modulo che sta provando ad aprire il componente, ovviamente oltre al export componente ed elencarlo entryComponentsnell'array come hanno fatto le risposte precedenti.

imports: [
    ...
    TheModuleThatOwnTheTargetedComponent,
    ...
  ],

0

Nel mio caso ho risolto questo problema:
1) sistemazione NgxMaterialTimepickerModulein app module imports:[ ]
2) mettendo NgxMaterialTimepickerModulein testmodule.ts imports:[ ]
3) porre testcomponentin declartions:[ ]eentryComponents:[ ]

(Sto usando la versione angolare 8+)


-1

Dichiarare tutte le nuove pagine in app.module

@NgModule({
  declarations: [
    MyApp,
    RegisterPage,
    OtpPage,
    LoginPage,
    ForgetPasswordPage,ChatlistPage,ChatPage,TabsPage

    // AboutPage,

    // BusinessDetailDescPage,
    // BusinessDescPage
  ],
  imports: [
    BrowserModule,
    IonicModule.forRoot(MyApp),
    IonicStorageModule.forRoot(),
    HttpClientModule,
    NgxBarcodeModule
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp,
    RegisterPage,
    OtpPage,
    LoginPage,
    ForgetPasswordPage,ChatlistPage,ChatPage,TabsPage
    // AboutPage,

    // BusinessDetailDescPage,
    // BusinessDescPage
  ],

 - 


----------


---------

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.