Winkel 4: Keine Komponentenfactory gefunden. Haben Sie sie zu @ NgModule.entryComponents hinzugefügt?

300

Ich verwende die Angular 4-Vorlage mit Webpack und habe diesen Fehler, wenn ich versuche, eine Komponente (ConfirmComponent) zu verwenden:

Für ConfirmComponent wurde keine Komponentenfactory gefunden. Haben Sie es zu @ NgModule.entryComponents hinzugefügt?

Die Komponente ist in deklariert app.module.server.ts

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

Ich habe auch app.module.browser.tsundapp.module.shared.ts

Wie kann ich das beheben?

Mrapi
quelle
1
Wie Sie ConfirmComponentdie Details verwenden, reicht nicht aus, um Ihre Frage zu beantworten
Anik
Hallo, ich benutze es, nachdem ich meinen Komponentenimport {ConfirmComponent} aus "../confirm.component/confirm.component" importiert habe.
Mrapi
2
Lesen Sie hier über Einstiegskomponenten Hier ist, was Sie über dynamische Komponenten in Angular wissen müssen
Max Koretskyi
Wenn es als gemeinsame Komponente fungieren soll, können Sie es in die Deklarationen und entryComponents von CommonModule einfügen und von anderen Stellen entfernen.
Charitha Goonewardena
1
Für Angular Dialog gleicher Fehler und Fix! freakyjolly.com/…
Code Spy

Antworten:

437

Fügen Sie dies in Ihre module.ts,

declarations: [
  AppComponent,
  ConfirmComponent
]

Wenn sich ConfirmComponent in einem anderen Modul befindet, müssen Sie es dort exportieren, damit Sie es außerhalb verwenden können. Fügen Sie Folgendes hinzu:

exports: [ ConfirmComponent ]

--- Aktualisiere Angular 9 oder Angular 8 mit explizit aktiviertem Ivy ---

Einstiegskomponenten mit Efeu werden nicht mehr benötigt und sind jetzt veraltet

--- für Winkel 9 und 8 mit deaktiviertem Efeu ---

Bei einer dynamisch geladenen Komponente und damit eine ComponentFactory generiert werden kann, muss die Komponente auch zu den entryComponents des Moduls hinzugefügt werden:

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

gemäß der Definition von entryComponents

Gibt eine Liste der Komponenten an, die bei der Definition dieses Moduls kompiliert werden sollen. Für jede hier aufgeführte Komponente erstellt Angular eine ComponentFactory und speichert sie im ComponentFactoryResolver.

Fateh Mohamed
quelle
2
Hi.it ist bereits in app.module.shared.ts und entryComponents ist in app.module.server.ts
mrapi
3
Wenn sich ConfirmComponent in einem anderen Modul befindet, müssen Sie es dort exportieren, damit Sie es außerhalb verwenden können. Fügen Sie hinzu: exportiert: [ConfirmComponent] in Ihre app.module.shared.ts
Fateh Mohamed
1
Es ist die ng2-Bootstrap-Modal-Komponente von github.com/ankosoftware/ng2-bootstrap-modal/blob/master/…
mrapi
9
Vielen Dank an euch alle. !!!!!!! .. alle Deklarationen und entryComponents in die gleiche Datei app.module.shared.ts zu setzen, hat das Problem
behoben
9
Exporte funktionieren nicht ... entryComponents Option funktioniert bei mir!
Raja Rama Mohan Thavalam
132

Siehe die Details über entryComponent:

Wenn Sie eine Komponente dynamisch laden, müssen Sie sie in beide declarationsund entryComponent:

@NgModule({
  imports: [...],
  exports: [...],
  entryComponents: [ConfirmComponent,..],
  declarations: [ConfirmComponent,...],
  providers: [...]
})
Ali Adravi
quelle
5
Danke, ich meine, DANKE !!! Ich habe einen Dialog erstellt, um Daten in eine andere Komponente einzugeben (der Dialog hat seine Komponentendeklaration in der anderen Komponente und dialog.html für das Layout)
Ramon Araujo
3
Dies hat den Trick für mich getan und hat auch eine bessere Erklärung als die gewählte Antwort. Danke dir!
Arsen Simonean
2
Klar die beste Antwort für mich!
Tuxy42
Dies war die Lösung für mich; Ich habe eine Komponente im laufenden Betrieb erstellt und hatte alles in den richtigen Modulen, bekam aber immer noch den Fehler. Das Hinzufügen meiner erstellten Komponenten entryComponentswar die Lösung - danke!
Novastorm
2
Meine Komponente, die ModalComponent aufruft, ist ein Enkel einer Komponente. Weder das Hinzufügen der ModalComponent zu entryComponentsnoch das Hinzufügen zu exportshat bei mir funktioniert. ABER ich kann die ModalComponent von einigen anderen Komponenten aufrufen, die keine Enkelkinder sind
canbax
54

TL; DR: Ein Dienst in NG6 mit providedIn: "root"kann die Component nicht finden , wenn die Komponente nicht in der addierte entryComponentsvon app.module .

Dieses Problem kann auch auftreten, wenn Sie Winkel 6 in Kombination mit der dynamischen Erstellung einer Komponente in einem Dienst verwenden!

Beispiel: Erstellen einer Überlagerung:

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

  constructor(private _overlay: Overlay) {}

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

    overlayRef.attach(portal).instance;
  }
}

Das Problem ist das

vorausgesetztIn: "root"

Definition, die diesen Dienst in app.module bereitstellt .

Befindet sich Ihr Dienst beispielsweise im "OverlayModule", in dem Sie auch die OverlayExampleComponent deklariert und zu den entryComponents hinzugefügt haben, kann der Dienst die ComponentFactory für OverlayExampleComponent nicht finden.

FaustmannChr
quelle
3
Angular-spezifisches Problem 6. Beheben Sie das Problem, indem Sie Ihre Komponente zu entryComponents in @NgModule @NgModule ({entryComponents: [yourComponentName]})
hinzufügen
6
Dies kann behoben werden, providedInindem die providersOption auf dem Modul entfernt und stattdessen verwendet wird.
Knelis
Vielen Dank für Informationen, aber das Hinzufügen zu @NgModule ({..., entryComponents: [...]}) funktionierte für mich auch mit zur Verfügung gestellt
::
1
Dies scheint im Zusammenhang mit github.com/angular/angular/issues/14324 zu stehen. Es scheint, dass es in Angular 9
Paolo Sanchi
Genau, besonders bei faul geladenen Modulen. Um dies zu beheben, habe ich NgModule.providers angegeben: [MyLazyLoadedModuleService] und MyLazyLoadedModuleService.providedIn von "root" in MyLazyLoadedmodule geändert.
Howard
45

Ich hatte das gleiche Problem. In diesem Fall imports [...]ist dies von entscheidender Bedeutung, da es nicht funktioniert, wenn Sie nicht importieren NgbModalModule.

Die Fehlerbeschreibung besagt, dass Komponenten zum entryComponentsArray hinzugefügt werden sollten, und es ist offensichtlich, aber stellen Sie sicher, dass Sie diese zuerst hinzugefügt haben:

imports: [
    ...
    NgbModalModule,
    ...
  ],
Alex Link
quelle
6
Du hast mich gerettet, Prost! Dies ist auf jeden Fall erforderlich, wenn Sie versuchen, eine Komponente in einem Modal zu öffnen. Die Fehlermeldung ist in dieser Situation etwas irreführend.
Beawolf
Woher importierst du es?
Mdomin45
In meinem Fall wurde der Import von NbDialogModule in NbDialogModule.forChild (null) geändert.
Maayan Hope
@ Mdomin45 {NgbModalModule} aus '@ ng-bootstrap / ng-bootstrap' importieren;
Mpatel
24

Fügen Sie diese Komponente zu entryComponents in @NgModule des Moduls Ihrer App hinzu:

entryComponents:[ConfirmComponent],

sowie Erklärungen:

declarations: [
    AppComponent,
    ConfirmComponent
]
RohitAneja
quelle
Rettete meinen Tag! Prost Kumpel
Sahan Serasinghe
Meine Komponente, die ModalComponent aufruft, ist ein Enkel einer Komponente. Weder das Hinzufügen der ModalComponent zu entryComponentsnoch das Hinzufügen zu exportshat bei mir funktioniert. ABER ich kann die ModalComponent von einigen anderen Komponenten aufrufen, die keine Enkelkinder sind
canbax
14

Fügen Sie 'NgbModalModule' in Importen und Ihren Komponentennamen in entryComponents App.module.ts hinzu, wie unten gezeigt Geben Sie hier die Bildbeschreibung ein

MayankGaur
quelle
Meine Komponente, die ModalComponent aufruft, ist ein Enkel einer Komponente. Weder das Hinzufügen der ModalComponent zu entryComponentsnoch das Hinzufügen zu exportshat bei mir funktioniert. ABER ich kann die ModalComponent von einigen anderen Komponenten aufrufen, die keine Enkelkinder sind
canbax
Ich muss diese Antwort wiederholen, wenn Ihre Komponente bereits zu entryComponents hinzugefügt wurde und das Problem weiterhin auftritt. Überprüfen Sie die von Ihnen verwendete modalComponent und fügen Sie sie dem Import-Array hinzu. Das hat mir das Leben gerettet!
Clyde
10

Platzieren Sie Komponenten, die dynamisch erstellt werden, in entryComponents unter der Funktion @NgModuledecorator.

@NgModule({
    imports: [
        FormsModule,
        CommonModule,
        DashbaordRoutingModule
    ],
    declarations: [
        MainComponent,
        TestDialog
    ],
    entryComponents: [
        TestDialog
    ]
})
Iman
quelle
1
Ja, das war super hilfreich. Wenn Sie einen Dialog angegeben haben, der nicht von einer Route erfasst, sondern dynamisch verwendet wird, muss er zu entryComponentsdem jeweiligen ng-Modul hinzugefügt werden, für das er deklariert ist.
Atconway
Meine Komponente, die ModalComponent aufruft, ist ein Enkel einer Komponente. Weder das Hinzufügen der ModalComponent zu entryComponentsnoch das Hinzufügen zu exportshat bei mir funktioniert. ABER ich kann die ModalComponent von einigen anderen Komponenten aufrufen, die keine Enkelkinder sind
canbax
10

Ich habe das gleiche Problem mit Winkel 6, das hat bei mir funktioniert:

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

})

Wenn Sie einen Dienst wie ConfirmService haben, müssen Sie diesen bei Anbietern des aktuellen Moduls anstelle von root deklarieren

Omar AMEZOUG
quelle
8

Ich hatte das gleiche Problem für Bootstrap Modal

{NgbModal} aus '@ ng-bootstrap / ng-bootstrap' importieren;

Wenn dies der Fall ist, fügen Sie die Komponente einfach zu den Moduldeklarationen und entryComponents hinzu, wie andere Antworten vorschlagen, und fügen Sie dies auch Ihrem Modul hinzu

{NgbModule} aus '@ ng-bootstrap / ng-bootstrap' importieren;

imports: [
   NgbModule.forRoot(),
   ...
]
Felipe Bejarano
quelle
8

Dieser Fehler tritt auf, wenn Sie versuchen, eine Komponente dynamisch zu laden, und:

  1. Die Komponente, die Sie laden möchten, ist kein Routing-Modul
  2. Die Komponente befindet sich nicht in Module entryComponents.

in routingModule

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

oder im Modul

entryComponents: [
ConfirmComponent
} 

Um diesen Fehler zu beheben, können Sie der Komponente einen Router hinzufügen oder ihn zu entryComponents des Moduls hinzufügen.

  1. Fügen Sie der Komponente einen Router hinzu. Der Nachteil dieses Ansatzes ist, dass auf Ihre Komponente mit dieser URL zugegriffen werden kann.
  2. Fügen Sie es zu entryComponents hinzu. In diesem Fall ist Ihrer Komponente keine URL zugeordnet und Sie können nicht über die URL darauf zugreifen.
Muhammad Nasir
quelle
8

Ich hatte das gleiche Problem in Angular7, als ich dynamische Komponenten erstellte. Es gibt zwei Komponenten (TreatListComponent, MyTreatComponent), die dynamisch geladen werden müssen. Ich habe gerade das Array entryComponents zu meiner Datei app.module.ts hinzugefügt.

    entryComponents: [
    TreatListComponent,
    MyTreatComponent
  ],
Chamila Maddumage
quelle
6

wenn Sie in Ihrer Anwendung Routing verwenden

Stellen Sie sicher, dass Sie dem Routing-Pfad neue Komponenten hinzufügen

zum Beispiel :

    const appRoutes: Routes = [
  { path: '', component: LoginComponent },
  { path: 'home', component: HomeComponent },
  { path: 'fundList',      component: FundListComponent },
];
Mohamathu Rafi
quelle
7
Nein, ich denke nicht, dass sich jede Komponente auf einer Route befinden sollte.
Mcanic
Nur die Seiten, die Sie anzeigen möchten, sollten sich in Routen befinden. Eine Seite kann mehrere Komponenten verwenden / anzeigen
Thibaud Lacan
Jedes Mal, wenn Sie der Route keine Komponente hinzufügen müssen, z. B. Modalitäten. Platzieren Sie Komponenten, die dynamisch erstellt werden, in entryComponents unter der Funktion @NgModuledecorator.
CodeMind
3

In meinem Fall brauchte ich überhaupt keine entryComponents - nur die Grundeinstellung, wie im folgenden Link beschrieben, aber ich musste den Import sowohl in das Haupt-App-Modul als auch in das umschließende Modul aufnehmen.

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

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

Sie müssen es nur zu entryComponents hinzufügen, wenn eine Komponente im Modal enthalten sein soll. Aus den Dokumenten:

Sie können eine vorhandene Komponente als Inhalt des modalen Fensters übergeben. Denken Sie in diesem Fall daran, die Inhaltskomponente als entryComponents-Abschnitt Ihres NgModule hinzuzufügen.

Dovev Hefetz
quelle
error TS2339: Property 'forRoot' does not exist on type 'typeof NgbModule'.mit Winkel 8
canbax
3

Ich hatte das gleiche Problem mit ag-grid mit dynamischen Komponenten. Ich habe festgestellt, dass Sie die dynamische Komponente zum ag-grid-Modul hinzufügen müssen .withComponents []

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

Eric Hewett
quelle
3

In meinem Fall habe ich vergessen MatDialogModule, Importe in einem untergeordneten Modul hinzuzufügen .

f.khantsis
quelle
2

Zur Verdeutlichung hier. ComponentFactoryResolverWenn Sie die Komponente nicht direkt verwenden und sie in den Dienst abstrahieren möchten, der dann in die Komponente eingefügt wird, müssen Sie sie unter den Anbietern für dieses Modul laden, da sie bei verzögertem Laden nicht funktioniert.

Sensei
quelle
2

Falls Sie nach dem Bereitstellen der Komponentendialogklasse immer noch den Fehler haben entryComponents, versuchen Sie einen Neustart ng serve- es hat bei mir funktioniert.

mgierw
quelle
2

Mein Fehler war das Aufrufen der offenen NgbModal-Methode mit falschen Parametern aus .html

JanBrus
quelle
2

Sie sollten das NgbModuleim Modul folgendermaßen importieren :

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

Youness HARDI
quelle
Perfekt für diesen Bruder die Beispiel-URL - hassantariqblog.wordpress.com/2017/02/12/…
Juan Ignacio Liska vor
1
  1. entryComponentses ist lebenswichtig. Die obigen Antworten hierzu sind richtig.

Aber...

  1. Wenn Sie einen Dienst sind, nach der das modal (ein gemeinsames Muster) und Ihr Modul, das die Dialogkomponente definiert öffnet nicht in AppModule geladen wird , müssen Sie ändern providedIn: 'root'zu providedIn: MyModule. Als allgemeine bewährte Methode sollten Sie nur die providedIn: SomeModulefür alle Dialogdienste verwenden, die sich in Modulen befinden.
jkyoutsey
quelle
0

Ich verwende Angular8 und versuche, die Komponente dynamisch aus einem anderen Modul zu öffnen. In diesem Fall müssen Sie import the modulein das Modul, das die Komponente öffnen möchte, natürlich zusätzlich zur export Komponente und sie in das entryComponentsArray eintragen wie die vorherigen Antworten.

imports: [
    ...
    TheModuleThatOwnTheTargetedComponent,
    ...
  ],
Furqan S. Mahmoud
quelle
0

In meinem Fall habe ich dieses Problem gelöst durch:
1) Platzieren NgxMaterialTimepickerModulein app module imports:[ ]
2) Platzieren NgxMaterialTimepickerModulein testmodule.ts imports:[ ]
3) Platzieren testcomponentin declartions:[ ]undentryComponents:[ ]

(Ich benutze Angular 8+ Version)

upks praveen
quelle
-1

Deklarieren Sie alle neuen Seiten 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
  ],

 - 


----------


---------

Supriya
quelle