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

สวัสดีฉันกำลังใช้งานอยู่หลังจาก imprting ในการนำเข้าส่วนประกอบของฉัน {ConfirmComponent} จาก "../confirm.component/confirm.component";
mrapi


ถ้ามันจะทำหน้าที่เป็นส่วนประกอบทั่วไปคุณสามารถใส่มันลงในการประกาศของ CommonModule และ entryComponents และลบออกจากที่อื่น
Charitha Goonewardena

1
สำหรับข้อผิดพลาดเดียวกันของ Angular Dialog และแก้ไข! freakyjolly.com/…
รหัส Spy

คำตอบ:


437

เพิ่มในของคุณmodule.ts,

declarations: [
  AppComponent,
  ConfirmComponent
]

หาก ConfirmComponent อยู่ในโมดูลอื่นคุณจะต้องส่งออกมันที่นั่นเพื่อให้คุณสามารถใช้งานได้นอกเพิ่ม:

exports: [ ConfirmComponent ]

--- อัปเดต Angular 9 หรือ Angular 8 ด้วยการเปิดใช้งาน Ivy อย่างชัดเจน ---

ส่วนประกอบรายการด้วย Ivy ไม่จำเป็นอีกต่อไปและตอนนี้เลิกใช้แล้ว

--- สำหรับ Angular 9 และ 8 ที่ปิดการใช้งาน Ivy ---

ในกรณีของส่วนประกอบที่โหลดแบบไดนามิกและเพื่อให้ ComponentFactory ถูกสร้างขึ้นส่วนประกอบนั้นจะต้องเพิ่มเข้าไปในรายการส่วนประกอบของโมดูลด้วย:

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

ตามคำจำกัดความของรายการส่วนประกอบ

ระบุรายการของส่วนประกอบที่ควรจะรวบรวมเมื่อมีการกำหนดโมดูลนี้ สำหรับแต่ละองค์ประกอบที่แสดงไว้ที่นี่ Angular จะสร้าง ComponentFactory และเก็บไว้ใน ComponentFactoryResolver


2
สวัสดี. มันอยู่ใน app.module.shared.ts และรายการส่วนประกอบอยู่ใน app.module.server.ts
mrapi

3
หาก ConfirmComponent อยู่ในโมดูลอื่นคุณจะต้องส่งออกไปที่นั่นเพื่อให้คุณสามารถใช้งานได้นอกเพิ่ม: ส่งออก: [ConfirmComponent] ใน app.module.shared.ts ของคุณ
Fateh Mohamed

1
มันเป็นส่วนประกอบ ng2-bootstrap-modal จาก github.com/ankosoftware/ng2-bootstrap-modal/blob/master/…
mrapi

9
ขอขอบคุณพวกคุณทุกคน !!!!!!! .. วางการประกาศและรายการส่วนประกอบทั้งหมดลงในไฟล์เดียวกัน app.module.shared.ts แก้ไขปัญหาได้
mrapi

9
การส่งออกไม่ทำงาน ... ตัวเลือกส่วนประกอบรายการทำงานให้ฉัน!
ราชาพระราม 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เป็นหลานของส่วนประกอบ ไม่ต้องเพิ่มModalComponentให้กับentryComponentsหรือเพิ่มมันเข้ากับการexportsทำงานของฉัน แต่ฉันสามารถเรียกModalComponentจากส่วนประกอบอื่น ๆ ที่ไม่ใช่หลาน
canbax

54

TL; DR: บริการใน NG6 กับprovidedIn: "root"ไม่สามารถหา ComponentFactory เมื่อตัวแทนจะไม่เพิ่มในentryComponentsของapp.module

ปัญหานี้อาจเกิดขึ้นได้หากคุณใช้ angular 6 ร่วมกับการสร้าง Component แบบไดนามิกในบริการ!

ตัวอย่างเช่นการสร้างภาพซ้อนทับ:

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

  constructor(private _overlay: Overlay) {}

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

    overlayRef.attach(portal).instance;
  }
}

ปัญหาคือ

ที่มีให้: "รูท"

นิยามซึ่งให้บริการนี้ในapp.module

ดังนั้นหากบริการของคุณอยู่ใน "OverlayModule" ซึ่งคุณได้ประกาศ OverlayExampleComponent และเพิ่มไปยัง entryComponents บริการจะไม่สามารถค้นหา ComponentFactory สำหรับ OverlayExampleComponent


3
ปัญหาเฉพาะสำหรับ Angular 6. แก้ไขปัญหาโดยการเพิ่มส่วนประกอบของคุณไปยัง entryComponents ใน @NgModule @NgModule ({entryComponents: [yourComponentName]})
DeanB_Develop

6
สามารถแก้ไขได้โดยการลบprovidedInและใช้providersตัวเลือกในโมดูลแทน
Knelis

ขอบคุณสำหรับข้อมูล แต่มันเพิ่มให้กับ @NgModule ({... , entryComponents: [... ]}) ทำงานให้ฉันด้วยแม้จะระบุไว้ใน: "root"
Mykola Mykolayovich Dolynskyi

1
ดูเหมือนว่าจะเกี่ยวข้องกับgithub.com/angular/angular/issues/14324ดูเหมือนว่าจะได้รับการแก้ไขใน Angular 9
Paolo Sanchi

โดยเฉพาะอย่างยิ่งในโมดูลที่มีสันหลังยาว ในการแก้ไขปัญหานี้ฉันได้ระบุ NgModule.providers: [MyLazyLoadedModuleService] และเปลี่ยน MyLazyLoadedModuleService.providedIn จาก "root" เป็น MyLazyLoadedmodule
โฮเวิร์ด

45

ฉันมีปัญหาเดียวกัน ในกรณีนี้เป็นสิ่งสำคัญเพราะมันจะไม่ทำงานถ้าคุณทำไม่ได้นำเข้าimports [...]NgbModalModule

คำอธิบายข้อผิดพลาดบอกว่าควรเพิ่มองค์ประกอบในentryComponentsอาร์เรย์และเห็นได้ชัด แต่ให้แน่ใจว่าคุณได้เพิ่มองค์ประกอบนี้ในสถานที่แรก:

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

6
คุณช่วยฉันด้วยเสียงไชโย! นี่เป็นสิ่งจำเป็นอย่างยิ่งเมื่อคุณพยายามที่จะเปิดองค์ประกอบใน modal ข้อความแสดงข้อผิดพลาดจะทำให้เข้าใจผิดเล็กน้อยในสถานการณ์นี้
beawolf

คุณนำเข้าจากที่ไหน
Mdomin45

ในกรณีของฉันเปลี่ยนการนำเข้า NbDialogModule เป็น NbDialogModule.forChild (null),
Maayan Hope

@ Mdomin45 นำเข้า {NgbModalModule} จาก '@ ng-bootstrap / ng-bootstrap';
mpatel

24

เพิ่มองค์ประกอบนั้นในรายการส่วนประกอบใน @NgModule ของโมดูลแอปของคุณ:

entryComponents:[ConfirmComponent],

เช่นเดียวกับการประกาศ:

declarations: [
    AppComponent,
    ConfirmComponent
]

บันทึกวันของฉัน! เพื่อนคู่ใจ
Sahan Serasinghe

องค์ประกอบของฉันซึ่งเรียกModalComponentเป็นหลานของส่วนประกอบ ไม่ต้องเพิ่มModalComponentให้กับentryComponentsหรือเพิ่มมันเข้ากับการexportsทำงานของฉัน แต่ฉันสามารถเรียกModalComponentจากส่วนประกอบอื่น ๆ บางอย่างที่ไม่ใช่หลาน
canbax

14

เพิ่ม 'NgbModalModule' ในการนำเข้าและชื่อส่วนประกอบของคุณในรายการส่วนประกอบ App.module.ts ที่แสดงด้านล่าง ป้อนคำอธิบายรูปภาพที่นี่


องค์ประกอบของฉันซึ่งเรียกModalComponentเป็นหลานของส่วนประกอบ ไม่ต้องเพิ่มModalComponentให้กับentryComponentsหรือเพิ่มมันเข้ากับการexportsทำงานของฉัน แต่ฉันสามารถเรียกModalComponentจากส่วนประกอบอื่น ๆ ที่ไม่ใช่หลาน
canbax

ฉันต้องย้ำคำตอบนี้อีกครั้งหากส่วนประกอบของคุณได้รับการเพิ่มเข้าไปในรายการส่วนประกอบแล้วและคุณยังคงประสบปัญหาตรวจสอบให้แน่ใจว่าได้ตรวจสอบ modalComponent ที่คุณใช้และเพิ่มในอาร์เรย์การนำเข้า! สิ่งนี้ช่วยชีวิตฉัน!
ไคลด์

10

วางองค์ประกอบที่สร้างแบบไดนามิกให้กับรายการส่วนประกอบภายใต้ฟังก์ชัน @NgModuledecorator

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

1
ใช่สิ่งนี้มีประโยชน์มาก - ถ้าคุณพูดถึงบทสนทนาที่ไม่ได้หยิบขึ้นมาโดยเส้นทาง แต่ใช้แบบไดนามิกมันจะต้องถูกเพิ่มลงentryComponentsในโมดูล ng ตามลำดับที่ประกาศไว้
atconway

องค์ประกอบของฉันซึ่งเรียกModalComponentเป็นหลานของส่วนประกอบ ไม่ต้องเพิ่มModalComponentให้กับentryComponentsหรือเพิ่มมันเข้ากับการexportsทำงานของฉัน แต่ฉันสามารถเรียกModalComponentจากส่วนประกอบอื่น ๆ บางอย่างที่ไม่ใช่หลาน
canbax

10

ฉันมีปัญหาเดียวกันกับ angular 6 นั่นคือสิ่งที่ทำงานให้ฉัน:

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

})

หากคุณมีบริการเช่นConfirmServiceต้องประกาศในผู้ให้บริการโมดูลปัจจุบันแทนรูท


8

ฉันมีปัญหาเดียวกันสำหรับ bootstrap modal

นำเข้า {NgbModal} จาก '@ ng-bootstrap / ng-bootstrap';

หากเป็นกรณีของคุณเพียงแค่เพิ่มส่วนประกอบในการประกาศโมดูลและรายการส่วนประกอบตามคำแนะนำอื่น ๆ ที่แนะนำ แต่ยังเพิ่มสิ่งนี้ในโมดูลของคุณ

นำเข้า {NgbModule} จาก '@ ng-bootstrap / ng-bootstrap';

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

8

ข้อผิดพลาดนี้เกิดขึ้นเมื่อคุณพยายามโหลดส่วนประกอบแบบไดนามิกและ:

  1. คอมโพเนนต์ที่คุณต้องการโหลดไม่ใช่โมดูลการกำหนดเส้นทาง
  2. คอมโพเนนต์ไม่อยู่ในรายการโมดูลคอมโพเนนต์

ใน routingModule

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

หรือในโมดูล

entryComponents: [
ConfirmComponent
} 

ในการแก้ไขข้อผิดพลาดนี้คุณสามารถเพิ่มเราเตอร์ในส่วนประกอบหรือเพิ่มเข้าไปในรายการส่วนประกอบของโมดูล

  1. เพิ่มเราเตอร์ใน component.drawback ของวิธีนี้คือส่วนประกอบของคุณจะสามารถเข้าถึงได้ด้วย url นั้น
  2. เพิ่มไปยังรายการส่วนประกอบ ในกรณีนี้ส่วนประกอบของคุณจะไม่มี url ใด ๆ ติดอยู่และจะไม่สามารถเข้าถึงได้ด้วย url

8

ฉันมีปัญหาเดียวกันใน Angular7 เมื่อฉันสร้างส่วนประกอบแบบไดนามิก มีสององค์ประกอบ (TreatListComponent, MyTreatComponent) ที่ต้องโหลดแบบไดนามิก ฉันเพิ่งเพิ่มรายการอาร์เรย์ส่วนประกอบในไฟล์ 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

ทุกครั้งที่คุณไม่จำเป็นต้องเพิ่มองค์ประกอบในเส้นทางเช่น Modals วางองค์ประกอบที่สร้างแบบไดนามิกให้กับรายการส่วนประกอบภายใต้ฟังก์ชั่น @NgModuledecorator
CodeMind

3

ในกรณีของฉันฉันไม่ต้องการรายการส่วนประกอบเลย - เพียงแค่การตั้งค่าพื้นฐานตามที่อธิบายไว้ในลิงค์ด้านล่าง แต่ฉันจำเป็นต้องรวมการนำเข้าทั้งในโมดูลแอพหลักและโมดูลการปิดล้อม

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

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

คุณจะต้องเพิ่มมันในรายการส่วนประกอบเท่านั้นหากส่วนประกอบจะรวมอยู่ใน modal จากเอกสาร:

คุณสามารถส่งผ่านองค์ประกอบที่มีอยู่เป็นเนื้อหาของหน้าต่างโมดัล ในกรณีนี้อย่าลืมเพิ่มองค์ประกอบเนื้อหาเป็นส่วนรายการส่วนประกอบของ NgModule ของคุณ


error TS2339: Property 'forRoot' does not exist on type 'typeof NgbModule'.ใช้เชิงมุม 8
canbax

3

ฉันได้รับปัญหาเดียวกันกับ ag-grid โดยใช้ส่วนประกอบแบบไดนามิก ฉันค้นพบว่าคุณจำเป็นต้องเพิ่มองค์ประกอบแบบไดนามิกในโมดูล ag-grid ด้วยภายในส่วนประกอบ []

การนำเข้า: [StratoMaterialModule, BrowserModule, AppRoutingModule, HttpClientModule, BrowserAnimationsModule, NgbModule.forRoot () FormsModule, ReactiveFormsModule, AppRoutingModule, AgGridModule.withComponents (ProjectUpdateButtonComponent) ]



2

เพื่อความกระจ่างที่นี่ ในกรณีที่คุณไม่ได้ใช้งานComponentFactoryResolverโดยตรงในองค์ประกอบและคุณต้องการสรุปมันเพื่อให้บริการซึ่งจะถูกฉีดเข้าไปในส่วนประกอบที่คุณต้องโหลดภายใต้ผู้ให้บริการสำหรับโมดูลนั้นเพราะถ้าหากขี้เกียจโหลดมันจะไม่ทำงาน


2

ในกรณีที่คุณยังคงมีข้อผิดพลาดหลังจากระบุคลาสไดอะล็อกคอมโพเนนต์entryComponentsลองรีสตาร์ทng serve- มันใช้งานได้สำหรับฉัน


2

ข้อผิดพลาดของฉันเรียกวิธีการเปิด NgbModal ด้วยพารามิเตอร์ที่ไม่ถูกต้องจาก. html


2

คุณควรนำเข้าNgbModuleในโมดูลดังนี้:

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


สมบูรณ์แบบสำหรับตัวอย่างนั้น url - hassantariqblog.wordpress.com/2017/02/12/…
Juan Ignacio Liska

1
  1. entryComponentsมีความสำคัญ คำตอบข้างต้นเกี่ยวกับสิ่งนี้ถูกต้อง

แต่...

  1. หากคุณกำลังให้บริการที่เปิดกิริยา (รูปแบบทั่วไป) และโมดูลของคุณที่กำหนดองค์ประกอบโต้ตอบไม่ได้โหลดใน AppModule ที่คุณจะต้องมีการเปลี่ยนแปลงไปprovidedIn: 'root' providedIn: MyModuleตามหลักปฏิบัติทั่วไปคุณควรใช้providedIn: SomeModuleบริการไดอะล็อกทั้งหมดที่อยู่ในโมดูล

0

ฉันกำลังใช้ Angular8 และฉันพยายามเปิดส่วนประกอบในรูปแบบโมดูลอื่นแบบไดนามิกในกรณีนี้คุณต้องimport the moduleเข้าสู่โมดูลที่พยายามเปิดส่วนประกอบแน่นอนนอกเหนือ exportจากส่วนประกอบและรายการลงในentryComponentsอาร์เรย์ เหมือนคำตอบก่อนหน้านี้

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

0

ในกรณีของฉันฉันแก้ไขปัญหานี้โดย:
1) การวางNgxMaterialTimepickerModuleในapp module imports:[ ]
2) การวางNgxMaterialTimepickerModuleในtestmodule.ts imports:[ ]
3) การวางtestcomponentในdeclartions:[ ]และ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.