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