Bileşen herhangi bir NgModule'ün parçası değil veya modül modülünüze aktarılmamış


106

Açısal 4 uygulama oluşturuyorum. Hata alıyorum

Error:Component HomeComponent is not part of any NgModule or the module has not been imported into your module.

HomeModule ve HomeComponent'ı oluşturdum. AppModule'a başvurmak için hangisine ihtiyacım var? Biraz kafam karıştı HomeModule veya HomeComponent'e başvurmam gerekir mi? Nihayetinde aradığım şey, kullanıcı Ana menüyü tıkladığında, dizin sayfasında görüntülenecek olan home.component.html'ye yönlendirilmelidir.

Uygulama modülü:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http'

import { AppComponent } from './app.component';
import { NavbarComponent } from './navbar/navbar.component';
import { TopbarComponent } from './topbar/topbar.component';
import { FooterbarComponent } from './footerbar/footerbar.component';
import { MRDBGlobalConstants } from './shared/mrdb.global.constants';
import { AppRoutingModule } from './app.routing';
import { HomeModule } from './Home/home.module';

@NgModule({
  declarations: [
    AppComponent,
    FooterbarComponent,
    TopbarComponent,
    NavbarComponent

  ],
  imports: [
    BrowserModule,
    HttpModule,
    AppRoutingModule,
    HomeModule

  ],
  providers: [MRDBGlobalConstants],
  bootstrap: [AppComponent]
})
export class AppModule { }

HomeModule:

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { HomeComponent } from './home.component';

@NgModule({
  imports: [
    CommonModule
  ],
  exports: [HomeComponent],
  declarations: [HomeComponent]
})
export class HomeModule { }

Ana Bileşen:

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {

  constructor() { }

  ngOnInit() {
  }

}

1
tembel yükleme kullanıyor musunuz?
Max Koretskyi

1
Evet. Tembel yüklemeyle nasıl yaparım
Tom

4
eklemek HomeComponentiçinentryComponents
Max Koretskyi

Girişle ne demek istiyorsunBileşenler
Tom

5
burada okuyun ve işte bunu nasıl yapacağınız:@NgModule({ imports: [ CommonModule ], exports: [HomeComponent], declarations: [HomeComponent], entryComponents: [HomeComponent] })
Max Koretskyi

Yanıtlar:


97

Tembel yüklemeyi kullanmıyorsanız, HomeComponent'inizi app.module'da içe aktarmanız ve bildirimler altında belirtmeniz gerekir. Ayrıca, ithalattan çıkarmayı unutmayın

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import {FormsModule} from '@angular/forms';
import {HttpModule} from '@angular/http'

import { AppComponent } from './app.component';
import { NavbarComponent } from './navbar/navbar.component';
import { TopbarComponent } from './topbar/topbar.component';
import { FooterbarComponent } from './footerbar/footerbar.component';
import { MRDBGlobalConstants } from './shared/mrdb.global.constants';
import {AppRoutingModule} from './app.routing';
import {HomeModule} from './Home/home.module';
// import HomeComponent here

@NgModule({
  declarations: [
    AppComponent,
    FooterbarComponent,
    TopbarComponent,
    NavbarComponent,
    // add HomeComponent here
  ],
  imports: [
    BrowserModule,
    HttpModule,
    AppRoutingModule,
    HomeModule  // remove this

  ],
  providers: [MRDBGlobalConstants],
  bootstrap: [AppComponent]
})
export class AppModule { }

1
Hala Bileşen HomeComponent herhangi bir NgModule'ün parçası değil veya modül modülünüze aktarılmadı hatası alıyorum.
Tom

İçe aktardığınız yerden yolunuzda bileşen olup olmadığını kontrol edin. Mevcut kodunuzu burada güncelleyip güncelleyemeyeceğinizi öğrenmek belki de kolay olacaktır
Gowtham

32
Lazy Loading kullanıyorsanız ne olacak?
DoubleA

angular-2-training-book.rangle.io/handout/modules/… - bu bağlantı, birisi tembel yükleme kullanmak isterse yardımcı olabilir
Mateusz Migała

Evet, bu HomeModule'a sahip olma amacını bozmaz mı?
Nick Gallimore

58

Benim durumumda, yalnızca sunucuyu yeniden başlatmam gerekiyor (yani kullanıyorsanız ng serve).

Sunucu çalışırken her yeni modül eklediğimde bana oluyor.


1
bang head New to Angular ve bu beni ısırdı. Sunucuyu yeniden başlattı ve harika çalıştı.
squillman

24

Benim durumumda, ben benim yeni oluşturulan bileşen eksikti declarationsat app.module.ts:

@NgModule({
  declarations: [
    AppComponent,
    ....
    NewGeneratedComponent, //this was missing
    ....
  ],
  imports: [
    ....

Tembel yükleme özellikleriyle uğraştım ve yorum yapmaya son verdim. Teşekkürler!
Sagar Khatri

Bu benim için cevaptı! Ayrıca, bu bir yönlendirme bileşeniyse, app-routing-module.ts'de bildirimleri ayarlayın
Robert Smith

11

Ben de aynı sorunu yaşadım. Nedeni, sunucum hala çalışırken bir bileşen oluşturmamdı. Çözüm, sunucuyu ve ng hizmetini tekrar bırakmaktır.


7

Tembel yükleme ve işlev formu içe aktarma deyimlerini kullanıyorsanız genel neden , sayfa modülü yerine yönlendirme modülünü içe aktarmaktır . Yani:

Yanlış :

loadChildren: () => import('./../home-routing.module').then(m => m.HomePageRoutingModule)

Doğru :

loadChildren: () => import('./../home.module').then(m => m.HomePageModule)

Bundan bir süre kurtulabilirsiniz, ancak sonunda sorunlara neden olacaktır.


6

Bu hata mesajını 2 ayrı durumda, Angular 7'de tembel yükleme ile karşılaştım ve yukarıdakiler yardımcı olmadı. Aşağıdakilerin her ikisinin de çalışması için, tamamen doğru bir şekilde güncellenmesi için hizmeti durdurup yeniden başlatmanız GEREKİR.

1) İlk kez AppModule'ümü yavaş yüklü özellik modülüne yanlış bir şekilde içe aktarmıştım. Bu içe aktarmayı tembel yüklü modülden kaldırdım ve tekrar çalışmaya başladı.

2) İkinci kez, AppModule'a aktardığım ayrı bir CoreModule'üm vardı VE # 1 ile aynı tembel yüklü modül. Bu içe aktarmayı tembel yüklü modülden kaldırdım ve tekrar çalışmaya başladı.

Temel olarak, ithalat hiyerarşinizi kontrol edin ve ithalat sırasına çok dikkat edin (olması gereken yere ithal ediliyorlarsa). Geç yüklenen modüller yalnızca kendi yol bileşenlerine / bağımlılıklarına ihtiyaç duyar. Uygulama ve ebeveyn bağımlılıkları, ister AppModule'a aktarılsın, ister tembel yüklü OLMAYAN ve bir üst modüle zaten içe aktarılmış başka bir özellik modülünden içe aktarılsın aktarılacaktır.


5

Benim durumumda, gerçek rotaların içe app.component.spec.tsaktarılması bu hata mesajlarına neden oluyordu. Çözüm, RouterTestingModulebunun yerine içe aktarmaktı .

import { TestBed, async } from '@angular/core/testing';
import { AppComponent } from './app.component';
import { RouterTestingModule } from '@angular/router/testing';

describe('AppComponent', () => {
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [
        AppComponent
      ],
      imports: [RouterTestingModule]
    }).compileComponents();
  }));

  it('should create the app', async(() => {
    const fixture = TestBed.createComponent(AppComponent);
    console.log(fixture);
    const app = fixture.debugElement.componentInstance;
    expect(app).toBeTruthy();
  }));

});

3

Aynı sorunla karşılaştım ve burada gördüklerimin hiçbiri işe yaramadı. Bileşeninizi app-routing.module sorununda listeliyorsanız, benim yaşadığım sorunun aynısıyla karşılaşmış olabilirsiniz.

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';

import { AppComponent } from './app.component';
import { NavbarComponent } from './navbar/navbar.component';
import { TopbarComponent } from './topbar/topbar.component';
import { FooterbarComponent } from './footerbar/footerbar.component';
import { MRDBGlobalConstants } from './shared/mrdb.global.constants';
import {AppRoutingModule} from './app.routing';
import {HomeModule} from './Home/home.module';
// import HomeComponent here

@NgModule({
  declarations: [
    AppComponent,
    FooterbarComponent,
    TopbarComponent,
    NavbarComponent,
    // add HomeComponent here
  ],
  imports: [
    BrowserModule,
    HttpModule,
    AppRoutingModule,
    HomeModule  // remove this

  ],
  providers: [MRDBGlobalConstants],
  bootstrap: [AppComponent]
})
export class AppModule { }

home / index.ts

export * from './';

app-routing.module.ts

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { HomeComponent } from './components';

const routes: Routes = [
    { path: 'app/home', component: HomeComponent },
    { path: '', redirectTo: 'app/home', pathMatch: 'full' },
    { path: '**', redirectTo: 'app/home' }
];

@NgModule({
    imports: [RouterModule.forRoot(routes)],
    exports: [RouterModule]
})
export class AppRoutingModule { }

home / home.module.ts

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
// import { HomeComponent } from './home.component'; This would cause app to break
import { HomeComponent } from './';
@NgModule({
  imports: [
    CommonModule
  ],
  exports: [HomeComponent],
  declarations: [HomeComponent]
})
export class HomeModule { }

Durumun tam olarak neden böyle olduğunu anladığımı iddia etmeyeceğim, ancak bileşenleri dışa aktarmak için indekslemeyi kullanırken (ve servisler için aynısını varsayıyorum), aynı bileşene ayrı modüllerde referans verirken bunları bilgisayardan içe aktarmanız gerekir. bu sorunu önlemek için aynı dosya, bu durumda dizin.


3

Açısal tembel yükleme

Benim durumumda, routing.ts'de içe aktarılan alt modülün parçası olan bir bileşeni unuttum ve yeniden içe aktardım.

....
...
 {
path: "clients",
component: ClientsComponent,
loadChildren: () =>
  import(`./components/users/users.module`).then(m => m.UsersModule)
}
.....
..

1

Benim durumumda Angular 6, modüllerimin klasör ve dosya adlarını google.map.module.ts'den google-map.module.ts olarak yeniden adlandırdım . Eski modül ve bileşen isimleri ile örtüşmeden derlemek için, ng derleyicisi hatasız derlendi. görüntü açıklamasını buraya girin

App.routes.ts içinde:

     {
        path: 'calendar', 
        loadChildren: './views/app-calendar/app-calendar.module#AppCalendarModule', 
        data: { title: 'Calendar', breadcrumb: 'CALENDAR'}
      },

Google-map.routing.ts içinde

import { GoogleMapComponent } from './google-map.component';
const routes: Routes = [
  {
    path: '', component: GoogleMapComponent, data: { title: 'Coupon Map' }
  }
];
@NgModule({
    exports: [RouterModule],
    imports: [RouterModule.forChild(routes)]
})
export class GoogleMapRoutingModule { }

Google-map.module.ts içinde:

import { GoogleMapRoutingModule } from './google-map.routing';
@NgModule({
  imports: [
    CommonModule,
    FormsModule,
    CommonModule,
    GoogleMapRoutingModule,
  ],
  exports: [GoogleMapComponent],
  declarations: [GoogleMapComponent]
})
export class GoogleMapModule { }

Bu maalesef sorunu çözdü, ancak <Custom>RouterModulebileşeni neden ihraç etmek zorunda kaldığını gerçekten anlamıyorum .
Yoraco Gonzales

1

Ben de aynı sorunla karşılaştım. Farklı bir klasör altında aynı ada sahip başka bir bileşen oluşturmuştum. bu yüzden uygulama modülümde her iki bileşeni de içe aktarmak zorunda kaldım ancak bir hile ile

import {DuplicateComponent as AdminDuplicateComponent} from '/the/path/to/the/component';

Sonra bildirimlerde bunun yerine AdminDuplicateComponent ekleyebilirim.

Gelecekte başvurmak için orada bırakacağımı düşündüm.


1

Lazy modülünüzü kontrol edin, tembel modülde AppRoutingModule'u içe aktardım. AppRoutingModule'un içe ve dışa aktarımlarını kaldırdıktan sonra Mine çalışmaya başladı.

import { AppRoutingModule } from '../app-routing.module'; 

1

Benim durumumda, bileşeni UserComponentbir modülden appModulediğerine taşıyordum dashboardModuleve yol tanımını appModuleAppRoutingModule dosyasındaki önceki modülün yönlendirmesinden kaldırmayı unuttum .

const routes = [
 { path: 'user', component: UserComponent, canActivate: [AuthGuard]},...]

Rota tanımını kaldırdıktan sonra iyi çalıştı.


0

geç yükleme kullanıyorsanız, bu modülü herhangi bir yönlendirici modülüne yüklemelisiniz, örneğin app-routing.module.ts {yol: 'home', loadChildren: './ home.module # HomeModule'}


0

Benim durumum belirtilen @ 7guyo ile aynı. Tembel yükleme kullanıyorum ve bilinçsizce bunu yapıyordum:

import { component1Route } from './path/component1.route';

export const entityState: Routes = [
{
   path: 'home',
   children: component1Route
}]

Onun yerine:

@NgModule({
imports: [
   RouterModule.forChild([
   {
     path: '',
     loadChildren: () => import('./component1/component1.module').then(m => m.ComponentOneModule)
  },
  {
    path: '',
    loadChildren: () => import('./component2/component2.module').then(m => m.ComponentTwoModule)
  }])
  ]})

  export class MainModule {}

0

Bunu basit iki adımda düzeltebilirsiniz:

Bileşeninizi (HomeComponent) declarationsdizi entryComponentsdizisine ekleyin .

Bu bileşen, atma seçicisine veya yönlendiriciye erişmediğinden, bunu entryComponnets dizisine eklemek önemlidir

nasıl yapılacağını görün:

@NgModule({
  declarations: [
    AppComponent,
    ....
    HomeComponent
  ],
  imports: [
    BrowserModule,
    HttpModule,
    ...

  ],
  providers: [],
  bootstrap: [AppComponent],
  entryComponents: [HomeComponent]
})
export class AppModule {} 

0

Tembel yükleme kullandığınızda, bileşen modülünüzü ve yönlendirme modülünü uygulama modülünden silmeniz gerekir. Yapmazsanız, uygulama başladığında bunları yüklemeye çalışır ve bu hatayı atar.

@NgModule({
   declarations: [
      AppComponent
   ],
   imports: [
      BrowserModule,
      FormsModule,
      HttpClientModule,
      AppRoutingModule,
      // YourComponentModule,
      // YourComponentRoutingModule
   ],
   bootstrap: [
      AppComponent
   ]
})
export class AppModule { }

0

Benim durumumda, modülü (DemoModule) içe aktarmak yerine modül yerine yanlış ithal ettim, içe aktarılan yönlendirme modülü (DemoRoutingModule)

Yanlış İthalat:

const routes: Routes = [
  {
  path: '', component: ContentComponent,
  children: [
  { path: '', redirectTo: 'demo' },
  { path: 'demo', loadChildren : () => import('../content/demo/demo-routing.module').then(m => m.DemoRoutingModule)}]
  }
];

Doğru Kod

const routes: Routes = [
  {
  path: '', component: ContentComponent,
  children: [
  { path: '', redirectTo: 'demo' },
  { path: 'demo', loadChildren : () => import('../content/demo/demo.module').then(m => m.DemoModule)}]
  }
];

0

Bileşeninizin app-routing.module.ts içine düzgün şekilde içe aktarıldığını doğrulayın. Benim durumumda sebep buydu


0

Önkoşullar: 1. Birden fazla Modülünüz varsa 2. Ve farklı bir modülden (AModule varsayalım), farklı bir modülde (BModule varsayalım) bir bileşen (DemoComponent varsayalım) kullanıyorsanız

O zaman AModülünüz

@NgModule({
  declarations: [DemoComponent],
  imports: [
    CommonModule
  ],
  exports: [AModule]
})
export class AModule{ }

ve BModülünüz olmalıdır

@NgModule({
  declarations: [],
  imports: [
    CommonModule, AModule
  ],
  exports: [],
})
export class BModule { }

0

Bazı durumlarda, HomeComponent için bir modül oluşturduğunuzda ve app-routing.module'de doğrudan her ikisini de verdiğinizde aynı şey olabilir.

bileşen: HomeComponent, loadChildren: "./ module /.../ HomeModule.module # HomeModule" Routes dizisinde.

tembel yüklemeyi denediğimizde yalnızca loadChildren niteliği veriyoruz.


0

Bu hatayı aldım çünkü 2 farklı modülde aynı bileşen adına sahiptim. Çözümlerden biri, ortak kullanımın dışa aktarma tekniğini vb. Kullanmasıdır, ancak benim durumumda her ikisinin de aynı adlandırılması gerekiyordu, ancak amaç farklıydı.

Asıl Sorun

Bu yüzden, bileşen B'yi içe aktarırken, intellisense, Bileşen A'nın yolunu içe aktardı, bu nedenle, intellisense bileşen yolunun 2. seçeneğini seçmem gerekti ve bu sorunumu çözdü.

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.