Angular 4: не найден компонент factory, вы добавили его в @NgModule.entryComponents?

Я использую шаблон Angular 4 с веб-пакетом, и у меня появляется эта ошибка, когда я пытаюсь использовать компонент (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

Добавьте это в свой module.ts,

declarations: [
  AppComponent,
  ConfirmComponent
]

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

exports: [ ConfirmComponent ]

В случае динамически загружаемого компонента и для генерирования ComponentFactory этот компонент также должен быть добавлен в модули entryComponents:

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

согласно определению entryComponents

Определяет список компонентов, которые должны быть скомпилированы при определении этого модуля. Для каждого компонента, указанного здесь, Angular создаст ComponentFactory и сохранит его в ComponentFactoryResolver.

Ответ 2

Смотрите подробную информацию о entryComponent:

Если вы загружаете какой-либо компонент динамически, то вам нужно поместить его как в declarations и в entryComponent:

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

Ответ 3

TL; DR: Служба в ng6 с providedIn: "root" In providedIn: "root" не может найти ComponentFactory, когда компонент не добавлен в entryComponents app.module.

Эта проблема также может возникнуть, если вы используете Angular 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;
  }
}

Проблема в том,

обеспечен в: "корень"

определение, которое предоставляет этот сервис в app.module.

Поэтому, если ваша служба находится, например, в "OverlayModule", где вы также объявили OverlayExampleComponent и добавили его в entryComponents, службе не удастся найти ComponentFactory для OverlayExampleComponent.

Ответ 4

Я была такая же проблема. В этом случае imports [...] имеет решающее значение, поскольку он не будет работать, если вы не импортируете NgbModalModule.

В описании ошибки указано, что компоненты должны быть добавлены в массив entryComponents и это очевидно, но убедитесь, что вы добавили это в первую очередь:

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

Ответ 5

Добавьте этот компонент в entryComponents в @NgModule вашего модуля приложения:

entryComponents:[ConfirmComponent],

а также Декларации:

declarations: [
    AppComponent,
    ConfirmComponent
]

Ответ 6

Добавьте "NgbModalModule" в импорт и имя вашего компонента в entryComponents App.module.ts, как показано ниже enter image description here

Ответ 7

У меня такая же проблема с angular 6, что у меня сработало:

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

})

Если у вас есть сервис, такой как ConfirmService, его нужно объявить в поставщиках текущего модуля вместо root

Ответ 8

Поместите компоненты, которые динамически создаются для entryComponents в функции @NgModuledecorator.

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

Ответ 9

У меня была такая же проблема для bootstrap modal

import {NgbModal} из '@ng-bootstrap/ng-bootstrap';

Если это ваш случай, просто добавьте компонент в объявления модуля и entryComponents, как предлагают другие ответы, но также добавьте это в свой модуль

import {NgbModule} из '@ng-bootstrap/ng-bootstrap';

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

Ответ 10

У меня была такая же проблема в Angular7 при создании динамических компонентов. Существует два компонента (TreatListComponent, MyTreatComponent), которые необходимо загружать динамически. Я просто добавил массив entryComponents в мой файл app.module.ts.

entryComponents: [
TreatListComponent,
MyTreatComponent

],

Ответ 11

Эта ошибка возникает, когда вы пытаетесь загрузить компонент динамически и:

  1. Компонент, который вы хотите загрузить, не является модулем маршрутизации.
  2. Компонент отсутствует в модуле entryComponents.

в роутингМодуле

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

или в модуле

entryComponents: [
ConfirmComponent
} 

Чтобы исправить эту ошибку, вы можете добавить маршрутизатор к компоненту или добавить его в entryComponents модуля.

  1. Добавьте маршрутизатор к component.drawback этого подхода, если ваш компонент будет доступен по этому URL.
  2. Добавьте его в entryComponents. в этом случае к вашему компоненту не будет привязан ни один URL, и он не будет доступен с помощью URL.

Ответ 12

если вы используете маршрутизацию в своем приложении

убедитесь, что добавлены новые компоненты в путь маршрутизации

например:

    const appRoutes: Routes = [
  { path: '', component: LoginComponent },
  { path: 'home', component: HomeComponent },
  { path: 'fundList',      component: FundListComponent },
];

Ответ 13

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

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

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

Вам нужно только добавить его в entryComponents, если компонент будет включен в модальное. Из документов:

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

Ответ 14

Я получил ту же проблему с ag-grid с использованием динамических компонентов. Я обнаружил, что вам нужно добавить динамический компонент в модуль ag-grid.withComponents []

импортирует: [StratoMaterialModule, BrowserModule, AppRoutingModule, HttpClientModule, BrowserAnimationsModule, NgbModule.forRoot(), FormsModule, ReactiveFormsModule, AppRoutingModule, AgGridModule.withComponateBoponent)()

Ответ 15

Для уточнения здесь. В случае, если вы не используете ComponentFactoryResolver непосредственно в компоненте, и вы хотите абстрагировать его в сервис, который затем внедряется в компонент, вы должны загрузить его в соответствии с поставщиками для этого модуля, поскольку при загрузке с отложенной загрузкой он не будет работать.

Ответ 16

Если после предоставления класса диалога компонента в entryComponents все еще возникает ошибка, попробуйте перезапустить ng serve - у меня это сработало.

Ответ 17

Debe agregarse el Componentte a importar en декларации и entryComponents

declarations: [
        AppComponent,
        ChatComponent
    ],
  entryComponents: [
        ChatComponent
    ],

Ответ 18

Моя ошибка была вызвана открытым методом NgbModal с неверными параметрами из .html