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


300

Я использую шаблон 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
Как вы используете ConfirmComponentдетали не достаточно, чтобы ответить на ваш вопрос
Аник

Привет. Я использую его после импорта в мой компонент импорта {ConfirmComponent} из "../confirm.component/confirm.component";
Мрапи


Если он будет действовать как общий компонент, вы можете поместить его в объявления CommonModule и entryComponents и удалить из других мест.
Charitha Goonewardena

1
Для Angular Dialog та же ошибка и исправление! freakyjolly.com/…
Кодовый шпион

Ответы:


438

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

declarations: [
  AppComponent,
  ConfirmComponent
]

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

exports: [ ConfirmComponent ]

--- Обновите Angular 9 или Angular 8 с явно включенным Ivy ---

Компоненты входа с Ivy больше не требуются и теперь устарели

--- для угловых 9 и 8 с отключенным плющом ---

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

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

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

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


3
Привет. Это уже в app.module.shared.ts и entryComponents находится в app.module.server.ts
Mrapi

4
если ConfirmComponent находится в другом модуле, вам нужно экспортировать его туда, поэтому вы можете использовать его снаружи, добавив: exports: [ConfirmComponent] в вашем app.module.shared.ts
Фатех Мохамед

1
это ng2-bootstrap-модальный компонент от github.com/ankosoftware/ng2-bootstrap-modal/blob/master/…
mrapi

9
Спасибо всем вам. !!!!!!! .. Поместив все объявления и entryComponents в один файл app.module.shared.ts, мы решили проблему
Mrapi

9
экспорт не работает ... опция entryComponents работает для меня!
Раджа Рама Мохан Тхавалам

133

Смотрите подробности о entryComponent:

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

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

5
Спасибо, я имею в виду, СПАСИБО !!! Я создавал диалог для ввода данных внутри другого компонента (в этом диалоге есть объявление компонента внутри другого компонента и dialog.html для макета)
Рамон Араужо

3
Это помогло мне, а также имеет лучшее объяснение, чем выбранный ответ. Спасибо!
Арсен Симонян

2
Очевидно, лучший ответ для меня!
tuxy42

Это было решением для меня; Я создавал компонент на лету, и все было в правильных модулях, но все равно получала ошибку. Добавление моих созданных компонентов entryComponentsбыло решением - спасибо!
Novastorm

2
Мой компонент, который вызывает ModalComponent, является внуком компонента. Ни добавление ModalComponent к, entryComponentsни добавление его к exportsмне не работало. НО я могу вызвать ModalComponent из некоторых других компонентов, которые не являются внуками
canbax

55

TL; DR: Служба в NG6 с 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.


3
Проблема, специфичная для Angular 6. Исправьте проблему, добавив свой компонент в entryComponents в @NgModule @NgModule ({entryComponents: [yourComponentName]})
DeanB_Develop

6
Это можно исправить, удалив providedInи вместо этого используя providersопцию на модуле.
Кнелис,

Спасибо за информацию, но это добавление в @NgModule ({..., entryComponents: [...]}) у меня работало даже с обеспеченным
In

1
кажется, что это связано с github.com/angular/angular/issues/14324, что, похоже, будет решено в Angular 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

Поместите компоненты, которые создаются динамически, в entryComponents под функцией @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 , его нужно объявить в поставщиках текущего модуля вместо 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. Добавьте маршрутизатор к component.drawback этого подхода, если ваш компонент будет доступен с этим 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
Нет, я не думаю, что каждый компонент должен быть в маршруте.
Mcanic

Только страницы, которые вы хотите отобразить, должны быть в маршрутах. Страница может использовать / отображать несколько компонентов
Thibaud Lacan

каждый раз, когда вам не нужно добавлять компонент в Route, например модалы. Поместите компоненты, которые создаются динамически, в entryComponents под функцией @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
канбакс

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.