Sudut 4: tidak ada pabrik komponen yang ditemukan, apakah Anda menambahkannya ke @ NgModule.entryComponents?

300

Saya menggunakan template Angular 4 dengan webpack dan saya memiliki kesalahan ini ketika saya mencoba menggunakan komponen (ConfirmComponent):

Tidak ditemukan pabrik komponen untuk ConfirmComponent. Apakah Anda menambahkannya ke @ NgModule.entryComponents?

Komponen dideklarasikan dalam app.module.server.ts

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

Saya juga app.module.browser.tsdanapp.module.shared.ts

Bagaimana saya bisa memperbaikinya?

mrapi
sumber
1
Bagaimana Anda menggunakan ConfirmComponentdetail tidak cukup untuk menjawab pertanyaan Anda
Anik
Hai. Saya menggunakannya setelah menerapkan impor komponen saya {ConfirmComponent} dari "../confirm.component/confirm.component";
mrapi
2
baca di sini tentang komponen entri Berikut adalah apa yang perlu Anda ketahui tentang komponen dinamis di Angular
Max Koretskyi
Jika itu akan bertindak sebagai komponen umum, Anda dapat memasukkannya ke dalam deklarasi dan entryComponents CommonModule, dan menghapus dari tempat lain.
Charitha Goonewardena
1
Untuk Dialog Angular kesalahan yang sama dan Perbaiki! freakyjolly.com/...
Code Spy

Jawaban:

437

Tambahkan ini di module.ts,

declarations: [
  AppComponent,
  ConfirmComponent
]

jika ConfirmComponent ada di modul lain, Anda perlu mengekspornya di sana sehingga Anda dapat menggunakannya di luar, tambahkan:

exports: [ ConfirmComponent ]

--- Perbarui Angular 9 atau Angular 8 dengan Ivy diaktifkan secara eksplisit ---

Komponen Masuk Dengan Ivy tidak diperlukan lagi dan sekarang sudah usang

--- untuk Angular 9 dan 8 dengan Ivy dinonaktifkan ---

Dalam kasus komponen yang dimuat secara dinamis dan agar ComponentFactory dihasilkan, komponen tersebut juga harus ditambahkan ke entri modulComponents:

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

sesuai dengan definisi entryComponents

Menentukan daftar komponen yang harus dikompilasi ketika modul ini didefinisikan. Untuk setiap komponen yang tercantum di sini, Angular akan membuat ComponentFactory dan menyimpannya di ComponentFactoryResolver.

Fateh Mohamed
sumber
2
Hi.it sudah ada di app.module.share.ts dan entryComponents ada di app.module.server.ts
mrapi
3
jika ConfirmComponent ada dalam modul lain, Anda perlu mengekspornya di sana sehingga Anda dapat menggunakannya di luar, tambahkan: ekspor: [ConfirmComponent] di app.module. Shared.ts Anda
Fateh Mohamed
1
itu adalah komponen ng2-bootstrap-modal dari github.com/ankosoftware/ng2-bootstrap-modal/blob/master/…
mrapi
9
Terima kasih kepada Anda semua. !!!!!!! .. menempatkan semua deklarasi dan entriComponents dalam file app.module.shared.ts yang sama memperbaiki masalah
mrapi
9
ekspor tidak berfungsi ... opsi entryComponents bekerja untuk saya!
Raja Rama Mohan Thavalam
132

Lihat detail tentang entryComponent:

Jika Anda memuat komponen apa pun secara dinamis maka Anda harus memasukkannya ke dalam keduanya declarationsdan entryComponent:

@NgModule({
  imports: [...],
  exports: [...],
  entryComponents: [ConfirmComponent,..],
  declarations: [ConfirmComponent,...],
  providers: [...]
})
Ali Adravi
sumber
5
Terima kasih, maksud saya, TERIMA KASIH !!! Saya sedang membuat dialog untuk memasukkan data ke dalam komponen lain (Dialog ini memiliki deklarasi komponen di dalam komponen lain, dan dialog.html untuk tata letak)
Ramon Araujo
3
Ini berhasil bagi saya dan juga memiliki penjelasan yang lebih baik daripada jawaban yang dipilih. Terima kasih!
Arsen Simonean
2
Jelas jawaban terbaik untuk saya!
tuxy42
Ini solusi bagi saya; Saya sedang membuat komponen dengan cepat dan memiliki semua yang ada di modul yang benar tetapi masih mendapatkan kesalahan. Menambahkan komponen yang saya buat entryComponentsadalah solusinya - terima kasih!
Novastorm
2
komponen saya yang memanggil ModalComponent adalah cucu komponen. Baik menambahkan ModalComponent untuk entryComponentsatau menambahkannya ke exportsbekerja untuk saya. TETAPI saya dapat memanggil ModalComponent dari beberapa komponen lain yang bukan cucu
canbax
54

TL; DR: Layanan di ng6 dengan providedIn: "root"tidak dapat menemukan ComponentFactory ketika Komponen tidak ditambahkan dalam entryComponentsdari app.module .

Masalah ini juga dapat terjadi jika Anda menggunakan angular 6 dalam kombinasi dengan pembuatan Komponen dalam layanan secara dinamis!

Misalnya, membuat Hamparan:

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

  constructor(private _overlay: Overlay) {}

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

    overlayRef.attach(portal).instance;
  }
}

Masalahnya adalah

tersedia di: "root"

definisi, yang menyediakan layanan ini di app.module .

Jadi, jika layanan Anda berada di, misalnya, "OverlayModule", di mana Anda juga mendeklarasikan OverlayExampleComponent dan menambahkannya ke entriComponents, layanan tidak dapat menemukan ComponentFactory for OverlayExampleComponent.

FaustmannChr
sumber
3
Masalah khusus untuk Angular 6. Perbaiki masalah dengan menambahkan komponen Anda ke entryComponents di @NgModule @NgModule ({entryComponents: [yourComponentName]})
DeanB_Develop
6
Ini dapat diperbaiki dengan menghapus providedIndan bukannya menggunakan providersopsi pada modul.
Knelis
Terima kasih atas info, tetapi itu menambahkan ke @NgModule ({..., entryComponents: [...]}) bekerja untuk saya bahkan dengan memberikanIn: "root"
Mykola Mykolayovich Dolynskyi
1
ini tampaknya terkait dengan github.com/angular/angular/issues/14324 tampaknya akan diselesaikan dalam Angular 9
Paolo Sanchi
Tepatnya, terutama dalam modul malas-sarat. Untuk memperbaikinya, saya menentukan NgModule.providers: [MyLazyLoadedModuleService] dan mengubah MyLazyLoadedModuleService.providedIn dari "root" ke MyLazyLoadedmodule.
Howard
45

Saya memiliki masalah yang sama. Dalam hal imports [...]ini sangat penting, karena itu tidak akan berhasil jika Anda tidak mengimpor NgbModalModule.

Deskripsi kesalahan mengatakan bahwa komponen harus ditambahkan ke entryComponentsarray dan itu jelas, tetapi pastikan Anda telah menambahkan ini di tempat pertama:

imports: [
    ...
    NgbModalModule,
    ...
  ],
Alex Link
sumber
6
Anda menyelamatkan saya, tepuk tangan! Ini sangat diperlukan ketika Anda mencoba untuk membuka komponen dalam modal. Pesan kesalahan agak menyesatkan dalam situasi ini.
beawolf
Dari mana Anda mengimpornya?
Mdomin45
Dalam kasus saya mengubah impor NbDialogModule ke NbDialogModule.forChild (null),
Maayan Hope
@ Mdomin45 import {NgbModalModule} dari '@ ng-bootstrap / ng-bootstrap';
mpatel
24

Tambahkan komponen itu ke entryComponents di @NgModule dari modul aplikasi Anda:

entryComponents:[ConfirmComponent],

serta Deklarasi:

declarations: [
    AppComponent,
    ConfirmComponent
]
RohitAneja
sumber
Selamatkan hari saya! Cheers mate
Sahan Serasinghe
komponen saya yang memanggil ModalComponent adalah cucu komponen. Baik menambahkan ModalComponent untuk entryComponentsatau menambahkannya ke exportsbekerja untuk saya. TETAPI saya bisa memanggil ModalComponent dari beberapa komponen lain yang bukan cucu
canbax
14

Tambahkan 'NgbModalModule' di impor dan nama komponen Anda di entryComponents App.module.ts seperti yang ditunjukkan di bawah ini masukkan deskripsi gambar di sini

MayankGaur
sumber
komponen saya yang memanggil ModalComponent adalah cucu komponen. Baik menambahkan ModalComponent untuk entryComponentsatau menambahkannya ke exportsbekerja untuk saya. TETAPI saya dapat memanggil ModalComponent dari beberapa komponen lain yang bukan cucu
canbax
Saya perlu mengulangi jawaban ini, jika komponen Anda telah ditambahkan ke entryComponents, dan Anda masih mengalami masalah, pastikan untuk memeriksa modalComponent yang Anda gunakan dan menambahkannya pada array impor! Ini menyelamatkan hidupku!
Clyde
10

Tempatkan komponen yang dibuat secara dinamis ke komponen entry di bawah fungsi @NgModuledecorator.

@NgModule({
    imports: [
        FormsModule,
        CommonModule,
        DashbaordRoutingModule
    ],
    declarations: [
        MainComponent,
        TestDialog
    ],
    entryComponents: [
        TestDialog
    ]
})
iman
sumber
1
Ya ini sangat membantu - jika Anda telah mengatakan dialog yang tidak diambil oleh rute tetapi digunakan secara dinamis, itu perlu ditambahkan ke entryComponentsmodul ng masing-masing yang dideklarasikan.
atconway
komponen saya yang memanggil ModalComponent adalah cucu komponen. Baik menambahkan ModalComponent untuk entryComponentsatau menambahkannya ke exportsbekerja untuk saya. TETAPI saya bisa memanggil ModalComponent dari beberapa komponen lain yang bukan cucu
canbax
10

Saya memiliki masalah yang sama dengan sudut 6, itulah yang bekerja untuk saya:

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

})

Jika Anda memiliki layanan seperti ConfirmService , harus dinyatakan dalam penyedia modul saat ini, bukan root

Omar AMEZOUG
sumber
8

Saya memiliki masalah yang sama untuk modal bootstrap

impor {NgbModal} dari '@ ng-bootstrap / ng-bootstrap';

Jika ini adalah kasus Anda, tambahkan saja komponen ke deklarasi modul dan entryComponents seperti yang disarankan tanggapan lain, tetapi juga tambahkan ini ke modul Anda

impor {NgbModule} dari '@ ng-bootstrap / ng-bootstrap';

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

Kesalahan ini terjadi ketika Anda mencoba memuat komponen secara dinamis dan:

  1. Komponen yang ingin Anda muat bukan modul perutean
  2. Komponen tidak ada dalam modul entri komponen.

dalam routingModule

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

atau dalam modul

entryComponents: [
ConfirmComponent
} 

Untuk memperbaiki kesalahan ini, Anda dapat menambahkan router ke komponen atau menambahkannya ke entryComponents modul.

  1. Tambahkan router ke component.drawback dari pendekatan ini adalah komponen Anda akan dapat diakses dengan url itu.
  2. Tambahkan ke entryComponents. dalam hal ini komponen Anda tidak akan memiliki url yang melekat dan itu tidak akan dapat diakses dengan url.
Muhammad Nasir
sumber
8

Saya memiliki masalah yang sama di Angular7 ketika saya membuat komponen dinamis. Ada dua komponen (TreatListComponent, MyTreatComponent) yang perlu dimuat secara dinamis. Saya baru saja menambahkan array entryComponents ke file app.module.ts saya.

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

jika Anda menggunakan perutean di aplikasi Anda

pastikan Tambahkan komponen baru ke jalur perutean

sebagai contoh :

    const appRoutes: Routes = [
  { path: '', component: LoginComponent },
  { path: 'home', component: HomeComponent },
  { path: 'fundList',      component: FundListComponent },
];
Mohamathu Rafi
sumber
7
Tidak, saya tidak berpikir setiap komponen harus dalam rute.
Mcanic
Hanya halaman yang ingin Anda tampilkan harus dalam rute. Sebuah halaman dapat menggunakan / menampilkan banyak komponen
Thibaud Lacan
setiap kali Anda tidak perlu menambahkan komponen ke Rute, seperti modals. Tempatkan komponen yang dibuat secara dinamis ke entryComponents di bawah fungsi @NgModuledecorator.
CodeMind
3

Dalam kasus saya, saya tidak perlu entriComponents sama sekali - hanya pengaturan dasar seperti yang dijelaskan dalam tautan di bawah ini, tetapi saya perlu memasukkan impor di modul aplikasi utama dan modul terlampir.

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

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

Anda hanya perlu menambahkannya ke entriComponents jika komponen akan dimasukkan dalam modal. Dari dokumen:

Anda dapat melewati komponen yang ada sebagai konten dari jendela modal. Dalam hal ini jangan lupa untuk menambahkan komponen konten sebagai bagian entryComponents dari NgModule Anda.

Dovev Hefetz
sumber
error TS2339: Property 'forRoot' does not exist on type 'typeof NgbModule'.menggunakan sudut 8
canbax
3

Saya mendapatkan masalah yang sama dengan ag-grid menggunakan komponen dinamis. Saya menemukan Anda perlu menambahkan komponen dinamis ke modul ag-grid .withComponents []

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

Eric Hewett
sumber
3

Dalam kasus saya, saya lupa menambahkan MatDialogModuleimpor dalam modul anak.

f.khantsis
sumber
2

Untuk klarifikasi di sini. Jika Anda tidak menggunakan ComponentFactoryResolverlangsung dalam komponen, dan Anda ingin abstrak ke layanan, yang kemudian disuntikkan ke dalam komponen Anda harus memuatnya di bawah penyedia untuk modul itu, karena jika malas dimuat itu tidak akan berfungsi.

sensei
sumber
2

Jika Anda masih memiliki kesalahan setelah memberikan kelas dialog komponen entryComponents, cobalah untuk me ng serve- restart - itu berhasil untuk saya.

mgierw
sumber
2

Kesalahan saya adalah memanggil metode terbuka NgbModal dengan parameter yang salah dari .html

JanBrus
sumber
2

Anda harus mengimpor NgbModuledalam modul seperti ini:

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

Youness HARDI
sumber
Sempurna untuk bro itu, contoh url - hassantariqblog.wordpress.com/2017/02/12/…
Juan Ignacio Liska
1
  1. entryComponentssangat penting. Di atas jawaban ini benar.

Tapi...

  1. Jika Anda menyediakan layanan yang membuka modal (pola umum) dan modul Anda yang mendefinisikan komponen dialog tidak dimuat di AppModule, Anda perlu perubahan providedIn: 'root'untuk providedIn: MyModule. Sebagai praktik umum yang baik, Anda harus menggunakan providedIn: SomeModuleuntuk semua layanan dialog yang ada dalam modul.
jkyoutsey
sumber
0

Saya menggunakan Angular8, dan saya mencoba membuka komponen secara dinamis dari modul lain , Dalam hal ini, Anda perlu import the modulemasuk ke modul yang mencoba membuka komponen, tentu saja di samping export komponen dan daftar ke dalam entryComponentsarray seperti jawaban sebelumnya.

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

Dalam kasus saya, saya memecahkan masalah ini dengan:
1) menempatkan NgxMaterialTimepickerModuledi app module imports:[ ]
2) menempatkan NgxMaterialTimepickerModuledi testmodule.ts imports:[ ]
3) menempatkan testcomponentdi declartions:[ ]danentryComponents:[ ]

(Saya menggunakan versi sudut 8+)

pujian praveen
sumber
-1

Nyatakan semua halaman baru di 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
sumber