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?


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


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.


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: [...]
})

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.


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

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
]

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


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
    ]
})

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


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(),
   ...
]

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.

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

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

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.


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


3

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


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.


2

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


2

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


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 {}



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.

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

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+)


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

 - 


----------


---------

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.