Açısal 4: Bileşen fabrikası bulunamadı, @ NgModule.entryComponents'e eklediniz mi?


303

Webpack ile Açısal 4 şablonu kullanıyorum ve bir bileşen (ConfirmComponent) kullanmaya çalıştığımda bu hata var:

ConfirmComponent için hiçbir bileşen fabrikası bulunamadı. @ NgModule.entryComponents'e eklediniz mi?

Bileşen app.module.server.ts

@NgModule({
  bootstrap: [ AppComponent ],
  imports: [
    // ...
  ],
  entryComponents: [
    ConfirmComponent,
  ],
})
export class AppModule { }

Bende var app.module.browser.tsveapp.module.shared.ts

Bunu nasıl düzeltebilirim?


1
ConfirmComponentSoruyu cevaplamak için ayrıntıları nasıl kullanıyorsunuz
Anik

Merhaba. "../Confirm.component/confirm.component" öğesinden {ConfirmComponent} bileşenimi içe aktardıktan sonra kullanıyorum;
mrapi


Ortak bir bileşen gibi davranacaksa, bunu CommonModule'un bildirimlerine ve entryComponent'lerine koyabilir ve başka yerlerden kaldırabilirsiniz.
Charitha Goonewardena

1
Açısal Diyalog için aynı hata ve Fix! freakyjolly.com/…
Code Spy

Yanıtlar:


441

Bunu module.ts,

declarations: [
  AppComponent,
  ConfirmComponent
]

ConfirmComponent başka bir modüldeyse, orayı dışa aktarmanız gerekir, böylece dışarıda kullanabilirsiniz, ekleyin:

exports: [ ConfirmComponent ]

--- Ivy'yi açıkça etkinleştirerek Açısal 9 veya Açısal 8'i güncelleyin ---

Ivy ile Giriş Bileşenleri artık gerekli değildir ve artık kullanımdan kaldırılmıştır

--- Ivy devre dışı olan Açısal 9 ve 8 için ---

Dinamik olarak yüklenmiş bir bileşen söz konusu olduğunda ve bir ComponentFactory'nin oluşturulması için, bileşenin modülün giriş bileşenlerine de eklenmesi gerekir:

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

entryComponents tanımına göre

Bu modül tanımlandığında derlenmesi gereken bileşenlerin listesini belirtir. Burada listelenen her bileşen için Angular bir ComponentFactory oluşturur ve bunu ComponentFactoryResolver'da depolar.


3
Hi.it zaten app.module.shared.ts ve entryComponents app.module.server.ts
mrapi

4
ConfirmComponent başka bir modüldeyse, onu dışa aktarmanız gerekir, böylece bunu dışarıda kullanabilirsiniz, ekleyin: export
Fateh Mohamed

1
ondan NG2-önyükleme-modal bileşenidir github.com/ankosoftware/ng2-bootstrap-modal/blob/master/...
mrapi

9
Hepinize teşekkürler. !!!!!!! .. tüm bildirimleri ve giriş bileşenlerini aynı dosyaya koymak app.module.shared.ts sorunu çözdü
mrapi

9
ihracat çalışmıyor ... entryBilgisayarlar seçeneği benim için çalışıyor !.
Raja Rama Mohan Thavalam

134

Ayrıntılara bakın hakkında entryComponent:

Dinamik sonra herhangi bir bileşen yüklüyorsanız hem koymak gerekir declarationsve entryComponent:

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

5
Teşekkürler, demek istediğim, TEŞEKKÜRLER !!! Başka bir bileşenin içine veri girmek için bir iletişim kutusu oluşturuyordum (İletişim kutusunun diğer bileşenin içinde bileşen bildirimi ve mizanpaj için dialog.html vardır)
Ramon Araujo

3
Bu benim için hile yaptı ve aynı zamanda seçilen cevaptan daha iyi bir açıklamaya sahip. Teşekkür ederim!
Arsen Simonean

2
Açıkçası benim için en iyi cevap!
tuxy42

Benim için çözüm buydu; Anında bir bileşen oluşturuyordum ve her şey doğru modüllerde vardı ama hala hatayı alıyordum. Oluşturduğum bileşenleri eklemek entryComponentsçözüm oldu - teşekkürler!
Novastorm

2
ModalComponent'i çağıran bileşenim bir bileşenin torunudur. Ne ModalComponent eklemek entryComponentsne de benim için exportsçalıştı. ANCAK torun olmayan bazı diğer bileşenlerden ModalComponent arayabilirim
canbax

55

TL; DR: ile ng6 bir hizmet providedIn: "root"Bileşen ilave değilken ComponentFactory bulamıyorum entryComponentsait app.module .

Bu sorun, açısal 6'yı bir hizmette dinamik olarak Bileşen oluşturma ile birlikte kullanıyorsanız da oluşabilir!

Örneğin, bir Yer Paylaşımı oluşturma:

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

  constructor(private _overlay: Overlay) {}

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

    overlayRef.attach(portal).instance;
  }
}

Sorun

sağlananIn: "kök"

app.module içinde bu hizmeti sağlayan tanım .

Hizmetiniz, örneğin, OverlayExampleComponent öğesini de bildirdiğiniz ve giriş bileşenlerine eklediğiniz "OverlayModule" içinde bulunuyorsa, hizmet OverlayExampleComponent için ComponentFactory öğesini bulamaz.


3
Açısal 6. Fix Sorun belirli @NgModule @NgModule içinde ({entryComponents: [yourComponentName]}) entryComponents için bileşeni ekleyerek sorun
DeanB_Develop

6
Bu , modül üzerindeki seçenek çıkartılarak providedInve bunun yerine kullanılarak düzeltilebilir providers.
Knelis

Bilgi için teşekkürler, ancak @NgModule ({..., entryComponents: [...]}) 'a ekleyerek sağlanan ile bile çalıştımIn: "root"
Mykola Mykolayovich Dolynskyi

1
Bu github.com/angular/angular/issues/14324 ile ilgili gibi görünüyor Angular 9
Paolo Sanchi

Kesinlikle, özellikle tembel yüklü modülde. Bunu düzeltmek için NgModule.providers: [MyLazyLoadedModuleService] 'i belirledim ve MyLazyLoadedModuleService.providedIn öğesini "root" tan MyLazyLoadedmodule olarak değiştirdim.
Howard

45

Aynı sorunu yaşadım. Bu durumda imports [...]çok önemlidir, çünkü içe aktarmazsanız çalışmaz NgbModalModule.

Hata açıklaması bileşenlerin entryComponentsdiziye eklenmesi gerektiğini ve açık olduğunu söylüyor , ancak bunu ilk başta eklediğinizden emin olun:

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

6
Beni kurtardın, şerefe! Bileşeni bir modda açmaya çalıştığınızda bu kesinlikle gereklidir. Hata mesajı bu durumda biraz yanıltıcıdır.
beawolf

Nereden alıyorsunuz?
Mdomin45

Benim durumumda NbDialogModule ithalatını NbDialogModule.forChild (null) olarak değiştirdi
Maayan Hope

@ Mdomin45 '@ ng-bootstrap / ng-bootstrap' den {NgbModalModule} 'u içe aktarır;
mpatel

24

Bu bileşeni, uygulamanızın modülünün @NgModule içindeki entryComponents öğesine ekleyin:

entryComponents:[ConfirmComponent],

beyanlar yanında:

declarations: [
    AppComponent,
    ConfirmComponent
]

Günümü kurtardım! Şerefe dostum
Sahan Serasinghe

ModalComponent'i çağıran bileşenim bir bileşenin torunudur. Ne ModalComponent eklemek entryComponentsne de benim için exportsçalıştı. AMA ben torun olmayan bazı diğer bileşenlerden ModalComponent arayabilir
canbax

14

İthalatta 'NgbModalModule' ve inputComponents App.module.ts içindeki bileşen adınızı aşağıda gösterildiği gibi ekleyin resim açıklamasını buraya girin


ModalComponent'i çağıran bileşenim bir bileşenin torunudur. Ne ModalComponent eklemek entryComponentsne de benim için exportsçalıştı. ANCAK torun olmayan bazı diğer bileşenlerden ModalComponent arayabilirim
canbax

Bileşeniniz entryComponents zaten eklenmişse ve hala sorun yaşıyorsanız, bu cevabı tekrarlamanız gerekiyor, kullandığınız modalComponent'i kontrol ettiğinizden ve import dizisine ekleyin! Bu hayatımı kurtardı!
Clyde

10

@NgModuledecorator işlevi altında inputComponents öğesine dinamik olarak oluşturulan bileşenleri yerleştirin.

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

1
Evet, bu çok yardımcı oldu - bir rota tarafından alınmayan ancak dinamik olarak kullanılan bir iletişim kutusu belirttiyseniz, entryComponentsbildirildiği ilgili ng modülüne eklenmesi gerekir .
atconway

ModalComponent'i çağıran bileşenim bir bileşenin torunudur. Ne ModalComponent eklemek entryComponentsne de benim için exportsçalıştı. AMA ben torun olmayan bazı diğer bileşenlerden ModalComponent arayabilir
canbax

10

Açısal 6 ile aynı problemim var, bu benim için işe yaradı:

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

})

ConfirmService gibi bir hizmetiniz varsa , root yerine geçerli modülün sağlayıcılarında bildirilmelidir


8

Bootstrap modalında da aynı sorunu yaşadım

'@ ng-bootstrap / ng-bootstrap' den {NgbModal} dosyasını içe aktarın;

Bu durumda, diğer modüllerin önerdiği gibi bileşeni modül bildirimlerine ve inputComponent'lerine ekleyin, ancak bunu modülünüze de ekleyin

'@ ng-bootstrap / ng-bootstrap' den {NgbModule} dosyasını içe aktarın;

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

8

Bu hata, bir bileşeni dinamik olarak yüklemeye çalıştığınızda oluşur ve:

  1. Yüklemek istediğiniz bileşen yönlendirme modülü değil
  2. Bileşen, modül giriş bileşenlerinde yok.

Yönlendirme Modülünde

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

veya modülde

entryComponents: [
ConfirmComponent
} 

Bu hatayı düzeltmek için bileşene bir yönlendirici ekleyebilir veya girişin modül bileşenlerine ekleyebilirsiniz.

  1. Bileşene bir yönlendirici ekleyin. Bu yaklaşımın geri çekilmesi, bileşeninize bu url ile erişilebileceğidir.
  2. Giriş bileşenlerine ekleyin. bu durumda bileşeninizde herhangi bir url bulunmayacak ve url ile erişilemeyecektir.

8

Dinamik bileşenler oluştururken Angular7'de de aynı sorunu yaşadım. Dinamik olarak yüklenmesi gereken iki bileşen (TreatListComponent, MyTreatComponent) vardır. Az önce app.module.ts dosyama entryComponents dizisini ekledim.

    entryComponents: [
    TreatListComponent,
    MyTreatComponent
  ],

6

uygulamanızda yönlendirme kullanıyorsanız

yönlendirme yoluna yeni bileşenler eklediğinizden emin olun

Örneğin :

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

7
Hayır, her bileşenin bir rotada olması gerektiğini düşünmüyorum.
Mcanic

Yalnızca görüntülemek istediğiniz sayfalar yollarda olmalıdır. Bir sayfa birden çok bileşeni kullanabilir / görüntüleyebilir
Thibaud Lacan

her zaman rotaya bileşen eklemenize gerek yok, örneğin modals. @NgModuledecorator işlevi altında inputComponents öğesine dinamik olarak oluşturulan bileşenleri yerleştirin.
CodeMind

3

Benim durumumda inputComponent'lere hiç ihtiyacım yoktu - sadece aşağıdaki bağlantıda açıklandığı gibi temel kurulum, ancak hem ana uygulama modülüne hem de eklenti modülüne içe aktarmayı dahil etmeliydim.

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

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

Yalnızca, bileşene kipte dahil edilecekse, giriş Bileşenlerine eklemeniz gerekir. Dokümanlardan:

Mevcut bir bileşeni kalıcı pencerenin içeriği olarak iletebilirsiniz. Bu durumda, içerik bileşenini NgModule'nizin inputComponents bölümü olarak eklemeyi unutmayın.


error TS2339: Property 'forRoot' does not exist on type 'typeof NgbModule'.açısal 8 kullanma
canbax

3

Aynı sorunu dinamik bileşenler kullanarak ag-grid ile de alıyordum. Ag-grid modülüne dinamik bileşen eklemeniz gerektiğini keşfettim .withComponents []

ithalat: [StratoMaterialModule, BrowserModule, AppRoutingModule, HttpClientModule, BrowserAnimationsModule, NgbModule.forRoot (), FormsModule, ReactiveFormsModule, AppRoutingModule, AgGridModule.withComponents (ProjectUpdateButtonComponent) ],


3

Benim durumumda, MatDialogModulebir alt modülde ithalat eklemeyi unuttum .


2

Burada açıklama için. ComponentFactoryResolverDoğrudan bileşen içinde kullanmıyorsanız ve onu hizmete soyutlamak istiyorsanız, daha sonra bileşene enjekte edilirse, bu modülün sağlayıcıları altında yüklemeniz gerekir, çünkü tembel yüklendiyse çalışmaz.


2

Bileşen iletişim kutusu sınıfını girdikten sonra hala hatayla karşılaşırsanız entryComponents, yeniden başlatmayı deneyin ng serve- bu benim için çalıştı.


2

Benim hatam .html yanlış parametreleri ile NgbModal açık yöntemi çağırıyordu


2
  1. entryComponentshayati öneme sahip. Bu konuda yukarıdaki cevaplar doğrudur.

Fakat...

  1. Kipi (ortak bir desen) açan bir hizmet sağlıyorsanız ve iletişim kutusu bileşenini tanımlayan modülünüz AppModule'a yüklenmemişse, olarak değiştirmeniz providedIn: 'root'gerekir providedIn: MyModule. Genel iyi uygulama olarak, sadece providedIn: SomeModulemodüllerdeki tüm iletişim hizmetlerini kullanmalısınız .

2

İçe olmalıdır NgbModuleiçinde modül böyle:

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



0

Angular8 kullanıyorum ve bileşeni dinamik olarak başka bir modül açmaya çalışıyorum , Bu durumda, elbette bileşene ek olarakimport the module bileşeni açmaya çalışan modüle girmeniz ve diziye listelemeniz gerekir önceki cevaplar gibi. exportentryComponents

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

0

Benim durumumda ben bu sorunu çözdü:
yerleştirerek 1) NgxMaterialTimepickerModuleiçinde app module imports:[ ]
yerleştirerek 2) NgxMaterialTimepickerModuleiçinde testmodule.ts imports:[ ]
yerleştirerek 3) testcomponentiçinde declartions:[ ]veentryComponents:[ ]

(Açısal 8+ sürümünü kullanıyorum)


-1

App.module'daki tüm yeni sayfalar

@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
  ],

 - 


----------


---------

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.