Je travaille sur une application Ionic
(2.0.0-rc0
) qui dépend de angular 2
. La nouvelle introduction de ngModules
est donc incluse. J'ajoute mon app.module.ts.
ci-dessous.
import { NgModule } from '@angular/core';
import { IonicApp, IonicModule } from 'ionic-angular';
import { MyApp } from './app.component';
import { Users } from '../pages/users/users';
@NgModule({
declarations: [
MyApp,
Users
],
imports: [
IonicModule.forRoot(MyApp)
],
bootstrap: [IonicApp],
entryComponents: [
MyApp,
Users
]
})
export class AppModule {}
Que fait entryComponents
ici? Components
sont déjà définis dans declarations
. Alors, quel est le besoin de les répéter? Que se passerait-il si je n'incluais pas de composant ici?
Cela concerne les composants ajoutés dynamiquement à l'aide de ViewContainerRef.createComponent()
. Leur ajout à entryComponents
indique au compilateur de modèles hors ligne de les compiler et de créer des fabriques pour eux.
Les composants enregistrés dans les configurations d'itinéraire sont automatiquement ajoutés à entryComponents
également, car router-outlet
utilise également ViewContainerRef.createComponent()
pour ajouter des composants routés au DOM.
Le compilateur de modèles hors ligne (OTC) ne construit que les composants réellement utilisés. Si des composants ne sont pas utilisés directement dans les modèles, l'OTC ne peut pas savoir s'ils doivent être compilés. Avec entryComponents, vous pouvez indiquer à l'OTC de compiler également ces composants afin qu'ils soient disponibles au moment de l'exécution.
Qu'est-ce qu'un composant d'entrée? (angular.io)
Documents NgModule (angular.io)
Définit les composants à compiler également lorsque ce composant est défini. Pour chaque composant répertorié ici, Angular créera une ComponentFactory et la stockera dans le ComponentFactoryResolver.
Si vous ne répertoriez pas de composant ajouté dynamiquement à entryComponents
, vous obtiendrez un message d'erreur concernant une fabrique manquante car Angular n'en aura pas créé.
Voir aussi https://angular.io/docs/ts/latest/cookbook/dynamic-component-loader.html
Vous n'aurez pas d'explication meilleure que celle des documents angulaires.
Et ci-dessous est l'explication de la documentation angulaire.
Un composant d’entrée est un composant que Angular charge impérativement par type.
Un composant chargé de manière déclarative via son sélecteur n'est pas un composant d'entrée.
La plupart des composants d'application sont chargés de manière déclarative. Angular utilise le sélecteur de composant pour localiser l'élément dans le modèle. Il crée ensuite la représentation HTML du composant et l'insère dans le DOM de l'élément sélectionné. Ce ne sont pas des composants d'entrée.
Quelques composants ne sont chargés que de manière dynamique et ne sont jamais référencés dans un modèle de composant.
La racine démarrée
AppComponent
est un composant d’entrée. Certes, son sélecteur correspond à une balise d'élément dans index.html. Maisindex.html
n'est pas un modèle de composant et le sélecteurAppComponent
ne correspond à aucun élément d'un modèle de composant.Angular charge AppComponent de manière dynamique car il est répertorié par type dans
@NgModule.bootstrap
ou boosté impérativement avec la méthode ngDoBootstrap du module.Les composants dans les définitions de route sont également des composants d'entrée. Une définition de route fait référence à un composant par son type. Le routeur ignore le sélecteur d'un composant routé (s'il en a même un) et charge le composant de manière dynamique dans un
RouterOutlet
.Le compilateur ne peut pas découvrir ces composants d'entrée en les recherchant dans d'autres modèles de composants. Vous devez en parler en les ajoutant à la liste
entryComponents
.Angular ajoute automatiquement les types de composants suivants à la variable
entryComponents
du module:
- Le composant dans la liste
@NgModule.bootstrap
.- Composants référencés dans la configuration du routeur.
Il n'est pas nécessaire de mentionner explicitement ces composants, bien que cela soit sans danger.
Le tableau entryComponents est utilisé pour définir uniquement les composants non trouvés en HTML et créés de manière dynamique. Angular a besoin de cette astuce pour trouver le composant d’entrée et les compiler.
Il existe deux principaux types de composants d'entrée:
Pour des informations plus détaillées sur les composants d’entrée, veuillez vous référer à angular.io https://angular.io/guide/entry-components
Les autres réponses le mentionnent, mais le résumé de base est le suivant:
Les composants de la boîte de dialogue Matériau sont créés à l'intérieur du code TS et non du modèle:
openDialog() {
const dialogRef = this.dialog.open(MyExampleDialog, { width: '250px' });
}
Cela nécessite de l'enregistrer en tant que entryComponent:
entryComponents: [MyExampleDialog]
Sinon, vous obtenez une erreur:
ERROR Error: No component factory found for MyExampleDialog. Did you add it to @NgModule.entryComponents?
entryComponent
entryComponent
est un composant quelconque Angular se charge impérativement. Vous pouvez déclarer entryComponent
en l'amorçant dans NgModule
ou dans les définitions de route.
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
FormsModule,
HttpClientModule,
AppRoutingModule
],
providers: [],
bootstrap: [AppComponent] // bootstrapped entry component
})
Documentation dit ci-dessous
Pour contraster les deux types de composants, certains modèles inclus dans le modèle sont déclaratifs. De plus, il y a des composants que vous chargez impérativement; c'est-à-dire des composants d'entrée.
entryComponents
Il y a entryComponents
tableau dans le fichier @NgModule
. Vous pouvez l'utiliser pour ajouter entryComponents
si le composant est démarré à l'aide de ViewContainerRef.createComponent()
.
C'est-à-dire que vous créez des composants de manière dynamique et non par amorçage ou dans un modèle.
const componentFactory = this.componentFactoryResolver.resolveComponentFactory(myComp.component);
const viewContainerRef = this.compHost.viewContainerRef;
viewContainerRef.clear();
const componentRef = viewContainerRef.createComponent(componentFactory);