Angular 4:コンポーネントファクトリが見つかりません。@ NgModule.entryComponentsに追加しましたか?


300

Angular 4テンプレートをwebpackで使用していますが、コンポーネント(ConfirmComponent)を使用しようとするとこのエラーが発生します。

ConfirmComponentのコンポーネントファクトリが見つかりません。@ NgModule.entryComponentsに追加しましたか?

コンポーネントはで宣言されています app.module.server.ts

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

私も持っている app.module.browser.tsし、app.module.shared.ts

どうすれば修正できますか?


1
ConfirmComponent詳細をどのように使用すれば、質問に答えるのに十分ではありません
Anik

こんにちは。私のコンポーネントインポート{ConfirmComponent}から "../confirm.component/confirm.component"に入力した後で使用しています。
mrapi 2017年

2
エントリコンポーネントについては、こちらをご覧ください
。Angularの

共通コンポーネントとして機能する場合は、CommonModuleの宣言とentryComponentsに配置して、他の場所から削除できます。
Charitha Goonewardena

1
Angular Dialogの場合も同じエラーと修正!freakyjolly.com/...
コードスパイ

回答:


437

これをに追加しmodule.ts

declarations: [
  AppComponent,
  ConfirmComponent
]

ConfirmComponentが別のモジュールにある場合は、そこにエクスポートする必要があるため、外部で使用できます。以下を追加します。

exports: [ ConfirmComponent ]

--- Ivyを明示的に有効にしてAngular 9またはAngular 8を更新する---

Ivyを使用した入力コンポーネントは不要になり、非推奨になりました

--- Ivyが無効になっているAngular 9および8の場合---

動的にロードされるコンポーネントの場合で、ComponentFactoryを生成するには、コンポーネントをモジュールのentryComponentsにも追加する必要があります。

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

entryComponentsの定義に従って

このモジュールの定義時にコンパイルする必要があるコンポーネントのリストを指定します。ここにリストされているコンポーネントごとに、AngularはComponentFactoryを作成し、ComponentFactoryResolverに格納します。


2
Hi.itはすでにapp.module.shared.tsにあり、entryComponentsはapp.module.server.tsにあります
mrapi

3
ConfirmComponentが別のモジュールにある場合は、そこにエクスポートする必要があるため、外部で使用できます。apps.module.shared.tsに次のように追加します。exports:[ConfirmComponent]
Fateh Mohamed

1
これは、github.com / ankosoftware / ng2-bootstrap-modal / blob / master /…のng2-bootstrap-modalコンポーネント です
mrapi

9
皆さん、ありがとうございました!!!!!!!!! ..同じファイルにすべての宣言とentryComponentsを置くapp.module.shared.tsが問題を修正しました
mrapi

9
エクスポートが機能しない... entryComponentsオプションが機能する!
Raja Rama Mohan Thavalam

132

詳細を参照してくださいについてのentryComponent

コンポーネントを動的にロードする場合は、declarationsとの両方に配置する必要がありますentryComponent

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

5
ありがとう、つまり、ありがとう!!! 私は別のコンポーネント内にデータを入力するダイアログを作成していました(ダイアログには他のコンポーネント内にコンポーネント宣言があり、レイアウトにはdialog.htmlがあります)
Ramon Araujo

3
これは私にとってはトリックであり、また、選択した回答よりも良い説明があります。ありがとうございました!
Arsen Simonean

2
明らかに私にとって最良の答えです!
tuxy42

これが私の解決策でした。私はその場でコンポーネントを作成していて、すべてを正しいモジュールに収めていましたが、それでもエラーが発生していました。私が作成したコンポーネントをentryComponentsに追加することが解決策でした-ありがとうございます!
Novastorm

2
ModalComponentを呼び出す私のコンポーネントは、コンポーネントの孫です。ModalComponententryComponents追加することも、追加することもexports私にとってはうまくいきませんでした。しかし私は、呼び出すことができますModalComponentを grandchildsないいくつかの他のコンポーネントから
canbax

54

TL; DR:とNG6内のサービスprovidedIn: "root"コンポーネントが中に添加されていない場合ComponentFactoryを見つけることができないentryComponentsapp.module

この問題は、サービスでコンポーネントを動的に作成することと組み合わせてAngular 6を使用している場合にも発生する可能性があります。

たとえば、オーバーレイを作成します。

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

  constructor(private _overlay: Overlay) {}

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

    overlayRef.attach(portal).instance;
  }
}

問題は

providedIn: "ルート"

app.moduleでこのサービスを提供する定義。

したがって、サービスが、たとえば、OverlayExampleComponentを宣言してentryComponentsに追加した「OverlayModule」にある場合、サービスはOverlayExampleComponentのComponentFactoryを見つけることができません。


3
Angular 6に固有の問題。@ NgModule @NgModule({entryComponents:[yourComponentName]})のentryComponentsにコンポーネントを追加して問題を修正します
DeanB_Develop

6
これは、モジュールのオプションprovidedInを削除して代わりに使用することで修正できprovidersます。
Knelis

情報をありがとう。ただし、@ NgModule({...、entryComponents:[...]})に追加すると、providedIn: "root"
Mykola Mykolayovich Dolynskyi

1
これはgithub.com/angular/angular/issues/14324に関連しているようです。Angular9で解決されるようです
Paolo Sanchi

正確には、特に遅延ロードされたモジュールで。これを修正するために、NgModule.providers:[MyLazyLoadedModuleService]を指定し、MyLazyLoadedModuleService.providedInを「root」からMyLazyLoadedmoduleに変更しました。
ハワード

45

同じ問題がありました。この場合imports [...]は重要ですNgbModalModule。インポートしないと機能しません。

エラーの説明では、コンポーネントをentryComponents配列に追加する必要があることは明らかですが、これを最初に追加したことを確認してください。

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

6
助けてくれて乾杯!これは、コンポーネントをモーダルで開こうとするときに明確に必要です。この状況では、エラーメッセージは少し誤解を招きます。
beawolf

どこからインポートしますか?
Mdomin45

私の場合はNbDialogModule.forChildにNbDialogModuleのインポート(ヌル)、変更
Maayan希望

@ Mdomin45 import {NgbModalModule} from '@ ng-bootstrap / ng-bootstrap';
mpatel

24

そのコンポーネントを、アプリのモジュールの@NgModuleのentryComponentsに追加します。

entryComponents:[ConfirmComponent],

および宣言:

declarations: [
    AppComponent,
    ConfirmComponent
]

私の日を救った!乾杯の仲間
Sahan Serasinghe

ModalComponentを呼び出す私のコンポーネントは、コンポーネントの孫です。ModalComponententryComponents追加することも、追加することもexports私にとってはうまくいきませんでした。しかし私は、呼び出すことができますModalComponentを grandchildsないいくつかの他のコンポーネントから
canbax

14

以下に示すように、インポートに「NgbModalModule」を、entryComponents App.module.tsにコンポーネント名を追加します。 ここに画像の説明を入力してください


ModalComponentを呼び出す私のコンポーネントは、コンポーネントの孫です。ModalComponententryComponents追加することも、追加することもexports私にとってはうまくいきませんでした。しかし私は、呼び出すことができますModalComponentを grandchildsないいくつかの他のコンポーネントから
canbax

コンポーネントをすでにentryComponentsに追加していて、それでも問題が解決しない場合は、この回答を繰り返す必要があります。使用しているmodalComponentを確認し、imports配列に追加してください。これは私の命を救った!
クライド

10

動的に作成されたコンポーネントを@NgModuledecorator関数の下のentryComponentsに配置します。

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

1
はい、これは非常に役に立ちました。ルートによってピックアップされないが動的に使用されるダイアログを言った場合entryComponentsは、宣言されたそれぞれのngモジュールに追加する必要があります。
atconway

ModalComponentを呼び出す私のコンポーネントは、コンポーネントの孫です。ModalComponententryComponents追加することも、追加することもexports私にとってはうまくいきませんでした。しかし私は、呼び出すことができますModalComponentを grandchildsないいくつかの他のコンポーネントから
canbax

10

私はangular 6と同じ問題を抱えています、それが私のために働いたものです:

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

})

ConfirmServiceのようなサービスがある場合は、ルートではなく現在のモジュールのプロバイダーで宣言する必要があります


8

ブートストラップモーダルでも同じ問題が発生しました

'@ ng-bootstrap / ng-bootstrap'から{NgbModal}をインポートします。

これがあなたのケースである場合、他の応答が示唆するようにモジュール宣言とentryComponentsにコンポーネントを追加するだけでなく、これをモジュールに追加してください

'@ ng-bootstrap / ng-bootstrap'から{NgbModule}をインポートします。

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

8

このエラーは、コンポーネントを動的にロードしようとしたときに発生します。

  1. ロードするコンポーネントはルーティングモジュールではありません
  2. コンポーネントがモジュールentryComponentsにありません。

routingModule内

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

またはモジュール内

entryComponents: [
ConfirmComponent
} 

このエラーを修正するには、コンポーネントにルーターを追加するか、モジュールのentryComponentsにルーターを追加します。

  1. このアプローチのcomponent.drawbackにルーターを追加すると、そのURLでコンポーネントにアクセスできるようになります。
  2. それをentryComponentsに追加します。この場合、コンポーネントにはURLがアタッチされておらず、URLでアクセスできません。

8

動的コンポーネントを作成すると、Angular7でも同じ問題が発生しました。動的にロードする必要がある2つのコンポーネント(TreatListComponent、MyTreatComponent)があります。entryComponents配列をapp.module.tsファイルに追加しました。

    entryComponents: [
    TreatListComponent,
    MyTreatComponent
  ],

6

アプリケーションでルーティングを使用する場合

新しいコンポーネントをルーティングパスに追加してください

例えば ​​:

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

7
いいえ、すべてのコンポーネントがルート内にあるとは限りません。
Mcanic

表示したいページのみがルートにある必要があります。ページは複数のコンポーネントを使用/表示できます
Thibaud Lacan

モーダルなど、Routeにコンポーネントを追加する必要がないたび。動的に作成されたコンポーネントを@NgModuledecorator関数の下のentryComponentsに配置します。
CodeMind

3

私の場合、entryComponentsはまったく必要ありませんでした。以下のリンクで説明されている基本的な設定だけですが、メインアプリモジュールとそれを含むモジュールの両方にインポートを含める必要がありました。

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

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

コンポーネントがモーダルに含まれる場合のみ、entryComponentsに追加する必要があります。ドキュメントから:

モーダルウィンドウのコンテンツとして既存のコンポーネントを渡すことができます。この場合、コンテンツコンポーネントをNgModuleのentryComponentsセクションとして追加することを忘れないでください。


error TS2339: Property 'forRoot' does not exist on type 'typeof NgbModule'.角度8を使用
canbax

3

動的コンポーネントを使用したag-gridでも同じ問題が発生していました。動的コンポーネントをag-gridモジュール.withComponents []に追加する必要があることを発見しました

インポート:[StratoMaterialModule、BrowserModule、AppRoutingModule、HttpClientModule、BrowserAnimationsModule、NgbModule.forRoot()、FormsModule、ReactiveFormsModule、AppRoutingModule、 AgGridModule.withComponents(ProjectUpdateButtonComponent) ]、


3

私の場合、MatDialogModule子モジュールのインポートに追加するのを忘れていました。


2

ここで明確にするために。ComponentFactoryResolverコンポーネントで直接使用しておらず、それをサービスに抽象化したい場合は、コンポーネントにインジェクトしてから、そのモジュールのプロバイダーの下にロードする必要があります。遅延ロードした場合は機能しません。


2

でコンポーネントダイアログクラスを指定した後もエラーが発生する場合はentryComponents、再起動してみてくださいng serve-私にとってはうまくいきました。


2

私のエラーは、.htmlからの不正なパラメーターでNgbModalオープンメソッドを呼び出すことでした


2

次のようNgbModuleモジュールにをインポートする必要があります

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



1
  1. entryComponents重要です。これに関する上記の答えは正しいです。

だが...

  1. モーダルを開くサービス(一般的なパターン)を提供していて、ダイアログコンポーネントを定義するモジュールがAppModuleに読み込まれていない場合は、に変更providedIn: 'root'する必要がありますprovidedIn: MyModule。一般的な良い習慣としてprovidedIn: SomeModule、モジュール内にあるすべてのダイアログサービスにを使用するだけです。

0

私はAngular8を使用しており、コンポーネントを動的開いて別のモジュールを形成しようとしています。この場合、import the moduleコンポーネントを開こうとしているモジュールに、もちろん コンポーネントに加えてexportentryComponents配列にリストする必要があります。以前の答えがしたように。

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

0

私の場合、私は、この問題を解決:
置く)1 NgxMaterialTimepickerModuleapp module imports:[ ]
置く)2 NgxMaterialTimepickerModuletestmodule.ts imports:[ ]
置く)3 testcomponentdeclartions:[ ]し、entryComponents:[ ]

(私は角度8+バージョンを使用しています)


-1

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
  ],

 - 


----------


---------

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.