Компонент не является частью какого-либо NgModule или модуль не был импортирован в ваш модуль


103

Я создаю приложение angular 4. Я получаю ошибку

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

Я создал HomeModule и HomeComponent. Какой из них мне нужен для обращения к AppModule? Я немного смущен. Мне нужно направить HomeModule или HomeComponent? В конечном итоге я ищу, когда пользователь нажимает на главное меню, он должен быть направлен на home.component.html, который будет отображаться на странице индекса.

App.module - это:

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 { }

HomeComponent - это:

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
вы используете ленивую загрузку?
— Макс Корецкий

1
Да. Как мне сделать это с ленивой загрузкой
— Том

4
добавить HomeComponentкentryComponents
— Макс Корецкий

Что вы имеете в виду под entryComponents
— Том

5
читайте здесь и вот как вы это делаете:@NgModule({ imports: [ CommonModule ], exports: [HomeComponent], declarations: [HomeComponent], entryComponents: [HomeComponent] })
— Макс Корецкий

Ответы:


95

Если вы не используете отложенную загрузку, вам необходимо импортировать свой HomeComponent в app.module и указать его в объявлениях. Также не забудьте удалить из импорта

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
Я все еще получаю сообщение об ошибке Компонент HomeComponent не является частью NgModule или модуль не был импортирован в ваш модуль.
— Tom

Проверьте, есть ли на вашем пути, откуда вы импортируете, компонент. Может быть, будет легко узнать, сможете ли вы обновить свой текущий код здесь
— Gowtham

30
Что насчет того, если вы используете отложенную загрузку?
— DoubleA

angular-2-training-book.rangle.io/handout/modules/… - эта ссылка может быть полезна, если кто-то хочет использовать ленивую загрузку
— Mateusz Migała

Ага, разве это не противоречит цели HomeModule?
— Ник

56

В моем случае мне нужно только перезапустить сервер (если вы его используете ng serve).

Со мной такое случается каждый раз, когда я добавляю новый модуль во время работы сервера.


bang head Новичок в Angular, и это меня укусило. Перезагрузил сервер, и он отлично работал.
— Сквиллман

23

В моем случае, я пропускал мой новый созданный компонент в declarationsна app.module.ts:

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

Возился с функциями ленивой загрузки и закончил тем, что комментировал это. Благодарность!
— Сагар Хатри

Это был ответ для меня! Кроме того, если это компонент маршрутизации, установите объявления в app-routing-module.ts
— Роберт Смит,

10

У меня такая же проблема. Причина в том, что я создал компонент, когда мой сервер еще работал. Решение состоит в том, чтобы закрыть сервер и снова выполнить обслуживание ng.


6

Обычная причина, если вы используете ленивую загрузку и операторы импорта функциональной формы, импортирует модуль маршрутизации вместо модуля страницы . Так:

Неправильно :

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

Правильно :

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

На какое-то время это может сойти с рук, но в конечном итоге это вызовет проблемы.


5

В моем случае app.component.spec.tsэти сообщения об ошибках были вызваны импортом реальных маршрутов . Решением было RouterTestingModuleвместо этого импортировать .

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();
  }));

});

5

Я сталкивался с этим сообщением об ошибке в двух разных случаях, с ленивой загрузкой в ​​Angular 7, и вышесказанное не помогло. Чтобы оба из приведенных ниже пунктов работали, вы ДОЛЖНЫ остановить и перезапустить ng serve, чтобы он полностью обновился правильно.

1) В первый раз я каким-то образом неправильно импортировал свой AppModule в ленивый загружаемый функциональный модуль. Я удалил этот импорт из модуля с ленивой загрузкой, и он снова начал работать.

2) Во второй раз у меня был отдельный CoreModule, который я импортировал в AppModule, И тот же модуль с ленивой загрузкой, что и # 1. Я удалил этот импорт из модуля с ленивой загрузкой, и он снова начал работать.

В основном, проверьте свою иерархию импорта и обратите особое внимание на порядок импорта (если они импортируются там, где должны быть). Для ленивых загружаемых модулей нужен только их собственный компонент / зависимости маршрута. Приложения и родительские зависимости будут переданы вниз независимо от того, импортированы ли они в AppModule или импортированы из другого функционального модуля, который НЕ загружен с отложенной загрузкой и уже импортирован в родительский модуль.


3

Я столкнулся с этой же проблемой, и ничего из того, что я здесь видел, не работало. Если вы указываете свой компонент в проблеме app-routing.module, возможно, вы столкнулись с той же проблемой, что и я.

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 { }

главная / 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 { }

Я не буду утверждать, что точно понимаю, почему это так, но при использовании индексации для экспорта компонентов (и я бы предположил то же самое для служб и т. Д.), Когда вы ссылаетесь на один и тот же компонент в отдельных модулях, вам необходимо импортировать их из тот же файл, в данном случае индекс, чтобы избежать этой проблемы.


3

Angular отложенная загрузка

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

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

1

В моем случае, Angular 6, я переименовал имена папок и файлов моих модулей с google.map.module.ts на google-map.module.ts. Чтобы скомпилировать без наложения со старыми именами модулей и компонентов, компилятор ng скомпилировал без ошибок. введите описание изображения здесь

В app.routes.ts:

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

В google-map.routing.ts

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:

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

К сожалению, это решило проблему, но я действительно не понимаю, зачем <Custom>RouterModuleнужно экспортировать компонент.
— Yoraco Gonzales

1

Я столкнулся с той же проблемой. Я создал еще один компонент с тем же именем в другой папке. поэтому в моем модуле приложения мне пришлось импортировать оба компонента, но с хитростью

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

Тогда в объявлениях я мог бы вместо этого добавить AdminDuplicateComponent.

Просто подумал, что оставлю это на будущее.


1

Проверьте свой модуль Lazy, я импортировал AppRoutingModule в модуль lazy. После удаления импорта и импорта AppRoutingModule, Mine начал работать.

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

1

В моем случае я перемещал компонент UserComponentиз одного модуля appModuleв другой dashboardModuleи забыл удалить определение маршрута из маршрутизации предыдущего модуля appModuleв файле AppRoutingModule.

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

После того, как я удалил определение маршрута, он работал нормально.


0

если вы используете ленивую загрузку, вам необходимо загрузить этот модуль в любой модуль маршрутизатора, например, в app-routing.module.ts {path: 'home', loadChildren: './ home.module # HomeModule'}


0

Мой случай такой же, как у @ 7guyo. Я использую ленивую загрузку и неосознанно делал это:

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

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

Вместо того:

@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

Вы можете исправить это, выполнив два простых шага:

Добавьте свой компонент (HomeComponent) в declarationsмассив entryComponentsмассивов.

Поскольку этот компонент не имеет доступа ни к селектору throw, ни к маршрутизатору, важно добавить его в массив entryComponnets.

посмотреть, как это сделать:

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

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

0

Когда вы используете ленивую загрузку, вам необходимо удалить модуль вашего компонента и модуль маршрутизации из модуля приложения. Если вы этого не сделаете, он попытается загрузить их при запуске приложения и выдаст эту ошибку.

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

0

В моем случае я импортировал неправильно, в месте модуля вместо импорта модуля (DemoModule) импортированный модуль маршрутизации (DemoRoutingModule)

Неправильный импорт:

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

Правильный код

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


0

Предпосылки: 1. Если у вас несколько модулей 2. И вы используете компонент (предположим, DemoComponent) из другого модуля (предположим, AModule), в другом модуле (предположим, BModule)

Тогда ваш AModule должен быть

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

и ваш BModule должен быть

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

0

В некоторых случаях то же самое может произойти, когда вы создали модуль для HomeComponent, а в app-routing.module вы напрямую указали оба

component: HomeComponent, loadChildren: "./ modules /.../ HomeModule.module # HomeModule" в массиве маршрутов.

когда мы пытаемся отложить загрузку, мы указываем только атрибут loadChildren.


0

Я получил эту ошибку, потому что у меня было одно и то же имя компонента в двух разных модулях. Одно из решений - это совместное использование техники экспорта и т. Д., Но в моем случае оба должны были называться одинаковыми, но цель была другой.

Настоящая проблема

Итак, при импорте компонента B intellisense импортировал путь к компоненту A, поэтому мне пришлось выбрать второй вариант пути к компоненту из intellisense, и это решило мою проблему.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.