364 votes

Angular 4 : aucune fabrique de composants trouvée, l'avez-vous ajouté à @NgModule.entryComponents ?

J'utilise un modèle Angular 4 avec webpack. et j'ai cette erreur lorsque j'essaie d'utiliser un composant (ConfirmComponent) :

Aucune usine de composants n'a été trouvée pour ConfirmComponent. L'avez-vous ajouté à @NgModule.entryComponents ?

Le composant est déclaré dans app.module.server.ts

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

J'ai aussi app.module.browser.ts y app.module.shared.ts

Comment puis-je réparer ça ?

1 votes

Comment utilisez-vous ConfirmComponent les détails ne sont pas suffisants pour répondre à votre question

0 votes

Bonjour, je l'utilise après avoir importé dans mon composant { ConfirmComponent } de "../confirm.component/confirm.component" ;

3 votes

538voto

Fateh Mohamed Points 5073

Ajoutez ceci dans votre module.ts ,

declarations: [
  AppComponent,
  ConfirmComponent
]

si ConfirmComponent est dans un autre module, vous devez l'exporter là pour pouvoir l'utiliser en dehors, ajouter :

exports: [ ConfirmComponent ]

---Mettre à jour Angular 9 ou Angular 8 avec Ivy explicitement activé---

Les composants d'entrée avec Ivy ne sont plus nécessaires et sont désormais obsolètes.

---pour Angular 9 et 8 avec Ivy désactivé---

Dans le cas d'un composant chargé dynamiquement et afin qu'un ComponentFactory soit généré, le composant doit également être ajouté aux entryComponents du module :

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

selon la définition de entryComponents

Spécifie une liste de composants qui doivent être compilés lorsque ce module est défini. Pour chaque composant listé ici, Angular créera un ComponentFactory et le stockera dans le ComponentFactoryResolver.

3 votes

Bonjour. Il est déjà dans app.module.shared.ts et entryComponents est dans app.module.server.ts

4 votes

Si ConfirmComponent est dans un autre module, vous devez l'exporter là pour pouvoir l'utiliser en dehors, ajoutez : exports : [ ConfirmComponent ] dans votre app.module.shared.ts

1 votes

C'est le composant ng2-bootstrap-modal de github.com/ankosoftware/ng2-bootstrap-modal/blob/master/

157voto

Ali Adravi Points 932

Voir les détails à propos de entryComponent :

Si vous chargez un composant de manière dynamique, vous devez le placer dans les deux éléments suivants declarations y entryComponent :

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

5 votes

Merci, je veux dire, MERCI ! !! J'ai créé un dialogue pour entrer des données dans un autre composant (le dialogue a sa déclaration de composant dans l'autre composant, et dialog.html pour la disposition).

3 votes

Cela a fait l'affaire pour moi et a également une meilleure explication que la réponse choisie. Merci !

2 votes

C'est clairement la meilleure réponse pour moi !

66voto

FaustmannChr Points 402

TL;DR : Un service dans ng6 avec providedIn: "root" ne peut pas trouver le ComponentFactory lorsque le composant n'est pas ajouté dans la base de données de l'utilisateur. entryComponents de app.module .

Ce problème peut également se produire si vous utilisez angular 6 en combinaison avec la création dynamique d'un composant dans un service !

Par exemple, la création d'une superposition :

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

  constructor(private _overlay: Overlay) {}

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

    overlayRef.attach(portal).instance;
  }
}

Le problème est le suivant

providedIn : "Root"

qui fournit ce service en app.module .

Ainsi, si votre service est situé, par exemple, dans le "OverlayModule", où vous avez également déclaré le composant OverlayExampleComponent et l'avez ajouté aux entryComponents, le service ne peut pas trouver le ComponentFactory pour OverlayExampleComponent.

3 votes

Problème spécifique à Angular 6. Corrigez le problème en ajoutant votre composant à entryComponents dans @NgModule @NgModule({ entryComponents :[ yourComponentName ] })

8 votes

Cela peut être corrigé en supprimant providedIn et utiliser à la place le providers sur le module.

0 votes

Merci pour l'info, mais l'ajout à @NgModule({ ... , entryComponents :[...] }) a fonctionné pour moi même avec providedIn : "Root"

55voto

Alex Link Points 372

J'ai eu le même problème. Dans ce cas imports [...] est crucial, car il ne fonctionnera pas si vous n'importez pas NgbModalModule .

La description de l'erreur indique que les composants doivent être ajoutés à entryComponents et c'est évident, mais assurez-vous que vous l'avez ajouté en premier lieu :

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

6 votes

Vous m'avez sauvé, merci ! C'est vraiment nécessaire lorsque vous essayez d'ouvrir un composant dans une modale. Le message d'erreur est un peu trompeur dans cette situation.

0 votes

D'où l'importez-vous ?

0 votes

Dans mon cas, j'ai changé l'importation de NbDialogModule en NbDialogModule.forChild(null),

25voto

RohitAneja Points 461

Ajoutez ce composant à entryComponents dans @NgModule du module de votre application :

entryComponents:[ConfirmComponent],

ainsi que les Déclarations :

declarations: [
    AppComponent,
    ConfirmComponent
]

0 votes

J'ai sauvé ma journée ! Merci, mon pote.

0 votes

Mon composant qui appelle Composant modal est le petit-fils d'un composant. Ni l'ajout de l'élément Composant modal a entryComponents ni l'ajouter à exports a fonctionné pour moi. MAIS Je peux appeler le Composant modal de certains autres composants qui ne sont pas des petits-enfants

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X