Кутова 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


Якщо він буде діяти як загальний компонент, ви можете помістити його в декларації CommonModule та entryComponents та видалити з інших місць.
— Charitha Goonewardena

1
Для кутового діалогу така ж помилка та виправлення! freakyjolly.com/…
— Code Spy

Відповіді:


437

Додайте це до свого module.ts,

declarations: [
  AppComponent,
  ConfirmComponent
]

якщо ConfirmComponent знаходиться в іншому модулі, вам потрібно експортувати його туди, таким чином ви зможете використовувати його зовні, додайте:

exports: [ ConfirmComponent ]

--- Оновіть кутовий 9 або кутовий 8 за допомогою явно включеного плюща ---

Компоненти для участі у програмі Ivy більше не потрібні, а тепер застарілі

--- для кутових 9 і 8 з обмеженим плющем ---

У випадку динамічно завантаженого компонента і для того, щоб генерувати ComponentFactory, компонент також повинен бути доданий до входу модуляComponents:

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

відповідно до визначення entryComponents

Визначає перелік компонентів, які слід скласти, коли цей модуль визначений. Для кожного перерахованого тут компонента Angular створить ComponentFactory і збереже його у ComponentFactoryResolver.


2
Привіт.it вже в app.module.shared.ts, а entryComponents є в app.module.server.ts
— mrapi

3
якщо ConfirmComponent знаходиться в іншому модулі, вам потрібно експортувати його туди, таким чином ви можете використовувати його зовні, додайте: export: [ConfirmComponent] у своєму app.module.shared.ts
— Fateh Mohamed

1
це ng2-bootstrap-модальний компонент від github.com/ankosoftware/ng2-bootstrap-modal/blob/master/…
— mrapi

9
Дякую усім вам. !!!!!!! .. Поклавши всі декларації та записиComponents в один і той же файл app.module.shared.ts вирішив проблему
— mrapi

9
експорт не працює ... опція entryComponents працює для мене !.
— Раджа Рама Мохан Тавалам

132

Дивіться деталі про entryComponent:

Якщо ви динамічно завантажуєте будь-який компонент, його потрібно помістити в обох declarationsі entryComponent:

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

5
Дякую, я маю на увазі, ДЯКУЮ !!! Я створював діалогове вікно для введення даних усередині іншого компонента (у діалоговому вікні є його декларація компонента всередині іншого компонента та dialog.html для макета)
— Рамон Араужо

3
Це зробило для мене хитрість, а також має кращі пояснення, ніж обрана відповідь. Дякую!
— Арсен Симонеан

2
Очевидно, найкраща відповідь для мене!
— tuxy42

Це було рішенням для мене; Я створював компонент на льоту і мав все в правильних модулях, але все ще отримував помилку. Додавання створених компонентів entryComponentsбуло рішенням - дякую!
— Новаторм

2
мій компонент, який називає ModalComponent, є онуком компонента. Ні додавання ModalComponent до entryComponentsні додаючи його exportsпрацював на мене. Але я можу назвати ModalComponent від інших компонентів, які не є онуками
— canbax

54

TL; DR: Служба в NG6 з providedIn: "root"не може знайти ComponentFactory , коли компонент не додають в entryComponentsз app.module .

Ця проблема також може виникнути, якщо ви використовуєте кутовий 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;
  }
}

Проблема - це

за умови: "root"

визначення, яке надає цю послугу в app.module .

Отже, якщо ваша служба розташована, наприклад, у "OverlayModule", де ви також оголосили OverlayExampleComponent і додали його до entryComponents, служба не може знайти ComponentFactory для OverlayExampleComponent.


3
Проблема, характерна для Angular 6. Виправте проблему, додавши свій компонент до entryComponents у @NgModule @NgModule ({entryComponents: [yourComponentName]})
— DeanB_Develop

6
Це можна виправити, видаливши providedInта замість цього скориставшись providersопцією на модулі.
— Knelis

Дякую за інформацію, але додавання до @NgModule ({..., entryComponents: [...]}) працювало на мене навіть при
— Микола Миколайович Долинський

1
це, мабуть, пов’язане з github.com/angular/angular/isissue/14324, здається, вирішиться в куті 9
— Паоло Санчі

Саме так, особливо в ледачому завантаженому модулі. Щоб виправити це, я вказав NgModule.providers: [MyLazyLoadedModuleService] і змінив MyLazyLoadedModuleService.providedIn з "root" на MyLazyLoadedmodule.
— Говард

45

У мене було те саме питання. У цьому випадку imports [...]вирішальне значення, оскільки воно не спрацює, якщо ви не імпортуєте NgbModalModule.

Опис помилки говорить про те, що компоненти повинні бути додані до entryComponentsмасиву, і це очевидно, але переконайтеся, що ви додали цей в першу чергу:

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

6
Ви врятували мене, ура! Це обов'язково потрібно, коли ви намагаєтесь відкрити компонент у модальному режимі. Повідомлення про помилку трохи вводить в оману в цій ситуації.
— beawolf

Звідки ви їх імпортуєте?
— Mdomin45

У моєму випадку змінив імпорт NbDialogModule на NbDialogModule.forChild (null),
— Maayan Hope

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

24

Додайте цей компонент до entryComponents в @NgModule модуля вашого додатка:

entryComponents:[ConfirmComponent],

а також декларації:

declarations: [
    AppComponent,
    ConfirmComponent
]

Врятував мій день!
— Матчі

мій компонент, який називає ModalComponent, є онуком компонента. Ні додавання ModalComponent до entryComponentsні додаючи його exportsпрацював на мене. Але я можу назвати ModalComponent від інших компонентів, які не є онуками
— canbax

14

Додати імпорт "NgbModalModule" та ім'я вашого компонента у entryComponents App.module.ts, як показано нижче введіть тут опис зображення


мій компонент, який називає ModalComponent, є онуком компонента. Ні додавання ModalComponent до entryComponentsні додаючи його exportsпрацював на мене. Але я можу назвати ModalComponent від інших компонентів, які не є онуками
— canbax

Мені потрібно повторити цю відповідь, якщо ваш компонент уже додано до entryComponents, і ви все ще відчуваєте проблему, переконайтеся, що ви перевіряєте використовуваний modalComponent та додайте його до масиву імпорту! Це врятувало мені життя!
— Клайд

10

Розмістіть компоненти, що створюються динамічно, для введення компонентів за допомогою функції @NgModuledecorator.

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

1
Так, це було дуже корисно - якщо ви скажете діалогове вікно, яке не підбирається маршрутом, але динамічно використовується, його потрібно додати до entryComponentsвідповідного модуля ng, який він оголосив.
— atconway

мій компонент, який називає ModalComponent, є онуком компонента. Ні додавання ModalComponent до entryComponentsні додаючи його exportsпрацював на мене. Але я можу назвати ModalComponent від інших компонентів, які не є онуками
— canbax

10

У мене така ж проблема з кутовим 6, ось що для мене спрацювало:

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

})

Якщо у вас є така послуга, як ConfirmService , потрібно задекларувати у постачальників поточного модуля замість root


8

У мене була така ж проблема з модальним завантаженням

імпортувати {NgbModal} з '@ ng-bootstrap / ng-bootstrap';

Якщо це у вашому випадку, просто додайте компонент до декларацій модуля та entryComponents, як підказують інші відповіді, але також додайте цей модуль

імпортувати {NgbModule} з '@ ng-bootstrap / ng-bootstrap';

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

8

Ця помилка виникає при спробі динамічно завантажити компонент і:

  1. Компонент, який потрібно завантажити, не є модулем маршрутизації
  2. Компонента немає в модулі entryComponents.

в маршрутизаціїМодуль

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

або в модулі

entryComponents: [
ConfirmComponent
} 

Щоб виправити цю помилку, ви можете додати до компонента маршрутизатор або додати його до entryComponents модуля.

  1. Додайте маршрутизатор до компонента.драббек цього підходу - ваш компонент буде доступний за допомогою цього URL-адреси.
  2. Додайте його до entryComponents. у цьому випадку до вашого компонента не буде додано ніяких URL-адрес, і він не буде доступний за допомогою URL-адреси.

8

У мене була така ж проблема в Angular7, коли я створював динамічні компоненти. Є два компоненти (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
Ні, я не думаю, що кожен компонент повинен бути у маршруті.
— Маканічний

Тільки сторінки, які ви хочете відображати, повинні бути в маршрутах. Сторінка може використовувати / відображати кілька компонентів
— Thibaud Lacan

кожного разу, коли вам не потрібно додавати компонент до маршруту, наприклад модалі. Розмістіть компоненти, що створюються динамічно, для введення компонентів за допомогою функції @NgModuledecorator.
— CodeMind

3

У моєму випадку мені взагалі не потрібна entryComponents - лише основна установка, як описано у посиланні нижче, але мені потрібно було включити імпорт як в основний модуль програми, так і в модуль, що додається.

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

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

Вам потрібно лише додати його до entryComponents, якщо компонент буде включений у модальний режим. З документів:

Ви можете передавати існуючий компонент як вміст модального вікна. У цьому випадку не забудьте додати компонент вмісту як розділ entryComponents вашого NgModule.


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

Моя помилка викликала відкритий метод NgbModal з неправильними параметрами з .html


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в модуль, який намагається відкрити компонент, звичайно на додаток до 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
  ],

 - 


----------


---------

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.