Angular2 RC6:'<component>不是已知元素'

fro*_*.io 115 angular

尝试运行我的Angular 2 RC6应用程序时,在浏览器控制台中出现以下错误:

> Error: Template parse errors: 'header-area' is not a known element:
> 1. If 'header-area' is an Angular component, then verify that it is part of this module.
> 2. If 'header-area' is a Web Component then add "CUSTOM_ELEMENTS_SCHEMA" to the '@NgModule.schema' of this component
> to suppress this message.("

    <div class="page-container">
        [ERROR->]<header-area></header-area>
        <div class="container-fluid">

> "): PlannerComponent@1:2
Run Code Online (Sandbox Code Playgroud)

我不明白为什么找不到该组件.我的PlannerModule看起来像这样:

@NgModule({
  declarations: [
    PlannerComponent,
    HeaderAreaComponent,
    NavbarAreaComponent,
    EreignisbarAreaComponent,
    GraphAreaComponent,
    nvD3
    ],
  imports: [
    RouterModule,
    CommonModule,
    ModalModule
    ],
  bootstrap: [PlannerComponent],
})
export class PlannerModule {}
Run Code Online (Sandbox Code Playgroud)

据我所知,ng2中的模块概念,模块的各个部分在'声明'中声明.为了完整性,这里是PlannerComponent:

@Component({
  selector: 'planner',
  providers: [CalculationService],
  templateUrl: './planner.component.html',
  styleUrls: ['./planner.component.styl']
})
export default class PlannerComponent {
}
Run Code Online (Sandbox Code Playgroud)

和HeaderAreaComponent:

@Component({
  selector: 'header-area',
  templateUrl: './header-area.component.html',
  styleUrls: ['./header-area.component.styl']
})
export default class HeaderAreaComponent {
}
Run Code Online (Sandbox Code Playgroud)

<header-area>-Tag位于planner.component.html:

<div class="page-container">
  <header-area></header-area>
  <div class="container-fluid">

    <div class="row">...
Run Code Online (Sandbox Code Playgroud)

我弄错了吗?

更新:完整代码

planner.module.ts:

import HeaderAreaComponent from '../header-area/header-area.component';
import NavbarAreaComponent from '../navbar-area/navbar-area.component';
import GraphAreaComponent from '../graph-area/graph-area.component';
import EreignisbarAreaComponent from '../ereignisbar-area/ereignisbar-area.component';
import PlannerComponent from './planner.component';
import {NgModule} from '@angular/core';
import {nvD3} from 'ng2-nvd3';
import {RouterModule} from '@angular/router';
import {CommonModule} from '@angular/common';
import {ModalModule} from 'ng2-bootstrap/ng2-bootstrap';

@NgModule({
  declarations: [
    PlannerComponent,
    HeaderAreaComponent,
    NavbarAreaComponent,
    EreignisbarAreaComponent,
    GraphAreaComponent,
    nvD3
  ],
  imports: [
    RouterModule,
    CommonModule,
    ModalModule
  ],
  bootstrap: [PlannerComponent],
})
export class PlannerModule {
  // TODO: get rid of the "unused class" warning
}
Run Code Online (Sandbox Code Playgroud)

planner.component.ts

import {Component} from '@angular/core';
import CalculationService from '../_shared/services/calculation.service/calculation.service';
import HeaderAreaComponent from '../header-area/header-area.component';

@Component({
  selector: 'planner',
  providers: [CalculationService],
  templateUrl: './planner.component.html',
  styleUrls: ['./planner.component.styl']
})
export default class PlannerComponent {
}
Run Code Online (Sandbox Code Playgroud)

planner.component.html

<div class="page-container">
  <header-area></header-area>
  <div class="container-fluid">

    <div class="row">
      <div class="col-xs-2 col-sm-1 sidebar">
        <navbar-area></navbar-area>
      </div>
      <div class="col-xs-10 col-sm-11">
        <graph-area></graph-area>
      </div>
    </div><!--/.row-->

    <div class="row">
      <div class="col-xs-10 col-sm-11 offset-sm-1">
        <ereignisbar-area></ereignisbar-area>
      </div>
    </div><!--/.row-->

  </div><!--/.container-->
</div><!--/.page-container-->
Run Code Online (Sandbox Code Playgroud)

Ste*_*aul 228

我将模块A导入模块B时遇到此错误,然后尝试使用模块B中模块A的组件.

这是在我的exports数组中声明该组件的问题.

@NgModule({
  declarations: [
    MyComponent
  ],
  exports: [
    MyComponent
  ]
})
export class ModuleA {}
Run Code Online (Sandbox Code Playgroud)
@NgModule({
  imports: [
    ModuleA
  ]
})
export class ModuleB {}
Run Code Online (Sandbox Code Playgroud)

  • 当然,Angular关于组件的文档甚至没有提到这一点. (44认同)

fro*_*.io 31

我在Sanket的回答和评论的帮助下修复了它.

什么,你会不知道,并在错误消息并不明显的是:我进口PlannerComponent@ NgModule.declaration在我的应用程序模块(= RootModule).

通过将PlannerModule导入为@NgModule.imports来修复错误.

之前:

@NgModule({
  declarations: [
    AppComponent,
    PlannerComponent,
    ProfilAreaComponent,
    HeaderAreaComponent,
    NavbarAreaComponent,
    GraphAreaComponent,
    EreignisbarAreaComponent
  ],
  imports: [
    BrowserModule,
    RouterModule.forRoot(routeConfig),
    PlannerModule
  ],
  bootstrap: [AppComponent]
})
export class AppModule {
Run Code Online (Sandbox Code Playgroud)

后:

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    RouterModule.forRoot(routeConfig),
    PlannerModule
  ],
  bootstrap: [AppComponent]
})
export class AppModule {
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助 :)

  • 我编辑了您的答案以更改格式以使差异更清晰。现在我已经这样做了,我发现区别似乎在于您只是从 `declarations` 中删除了一些项目。这可能是对的吗? (2认同)

小智 20

如果您已经使用了Webclipse自动生成的组件定义,您可能会发现选择器名称前面有"app-".显然,这是一个新的约定,用于声明主应用程序组件的子组件.如果您使用'new' - 'component'在Angular IDE中创建选择器,请检查您的选择器在组件中的定义方式.所以不要放

<header-area></header-area>
Run Code Online (Sandbox Code Playgroud)

你可能需要

<app-header-area></app-header-area>
Run Code Online (Sandbox Code Playgroud)


San*_*ket 7

在您的计划程序组件中,您必须缺少像这样的导入HeaderAreaComponent-

import { HeaderAreaComponent } from '../header-area.component'; 
//change path according your project
Run Code Online (Sandbox Code Playgroud)

此外,请确保 - 必须通过NgModule声明所有组件和管道.

看看这是否有帮助.


rez*_*e08 5

我对<flash-messages></flash-messages>角度5 遇到相同的问题。

您只需要在app.module.ts文件中添加以下行

import { ---, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { FlashMessageModule } from "angular-flash-message";


@NgModule({
  ---------------
  imports: [
    FlashMessageModule,
    ------------------         
  ], 
  -----------------
  schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
  ------------
})
Run Code Online (Sandbox Code Playgroud)

NB:我正在使用此消息发送Flash消息


Sha*_*war 5

我在Angular 7上遇到了这个问题,问题出在创建模块之后,我没有执行ng build。所以我表演了-

  • ng build
  • ng serve

而且有效。


小智 5

当组件不在<router-outlet>主应用程序页面中时,单元测试中出现错误。所以应该在测试文件中定义组件,如下所示。

<app-header></app-header>
<router-outlet></router-outlet>
Run Code Online (Sandbox Code Playgroud)

然后需要在spec.ts文件中添加如下。

import { HeaderComponent } from './header/header.component';

describe('AppComponent', () => {
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [
        RouterTestingModule
      ],
      declarations: [
        App`enter code here`Component,
        HeaderComponent <------------------------
      ],
    }).compileComponents();
  }));
});
Run Code Online (Sandbox Code Playgroud)