Angular2 RC6: '<component> не является известным элементом'
Я получаю следующую ошибку в консоли браузера при попытке запустить приложение 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">
> "): [email protected]:2
Я не понимаю, почему компонент не найден. Мой PlannerModule выглядит так:
@NgModule({
declarations: [
PlannerComponent,
HeaderAreaComponent,
NavbarAreaComponent,
EreignisbarAreaComponent,
GraphAreaComponent,
nvD3
],
imports: [
RouterModule,
CommonModule,
ModalModule
],
bootstrap: [PlannerComponent],
})
export class PlannerModule {}
и насколько я понял концепцию модулей в ng2, части модулей объявляются в "объявлениях". Для полноты, вот PlannerComponent:
@Component({
selector: 'planner',
providers: [CalculationService],
templateUrl: './planner.component.html',
styleUrls: ['./planner.component.styl']
})
export default class PlannerComponent {
}
и HeaderAreaComponent:
@Component({
selector: 'header-area',
templateUrl: './header-area.component.html',
styleUrls: ['./header-area.component.styl']
})
export default class HeaderAreaComponent {
}
<header-area>
-Tag находится в planner.component.html:
<div class="page-container">
<header-area></header-area>
<div class="container-fluid">
<div class="row">...
Я что-то не так понял?
Обновление: полный код
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
}
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 {
}
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-->
Ответы
Ответ 1
Я исправил его с помощью ответа на 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 {
После:
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
RouterModule.forRoot(routeConfig),
PlannerModule
],
bootstrap: [AppComponent]
})
export class AppModule {
}
Спасибо за вашу помощь:)
Ответ 2
Я получил эту ошибку, когда импортировал модуль A в модуль B, а затем попытался использовать компонент из модуля A в модуле B.
Решение состоит в том, чтобы объявить этот компонент в массиве exports
.
@NgModule({
declarations: [
MyComponent
],
exports: [
MyComponent
]
})
export class ModuleA {}
@NgModule({
imports: [
ModuleA
]
})
export class ModuleB {}
Ответ 3
Если вы использовали определение сгенерированного автоматически Webclipse автоматически, вы можете обнаружить, что к имени селектора добавлено "app-". По-видимому, это новое соглашение при объявлении подкомпонентов основного компонента приложения. Проверьте, как ваш селектор был определен в вашем компоненте, если вы использовали "новый" - "компонент" для его создания в Angular IDE. Поэтому вместо размещения
<header-area></header-area>
вам может понадобиться
<app-header-area></app-header-area>
Ответ 4
В вашем компоненте планировщика у вас должен отсутствовать импорт HeaderAreaComponent, например this-
import { HeaderAreaComponent } from '../header-area.component';
//change path according your project
Также убедитесь, что все компоненты и каналы должны быть объявлены через NgModule.
Посмотрите, поможет ли это.
Ответ 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 ]
------------
})
NB: Я использую этот для сообщений flash-сообщения
Ответ 6
Я столкнулся с этой проблемой на Angular 7, и проблема заключалась в том, что после создания модуля я не выполнял ng build
. Так я выполнил -
и это сработало.
Ответ 7
Ошибка в модульном тесте, когда компонент находится вне <router-outlet>
на главной странице приложения. поэтому следует определить компонент в тестовом файле, как показано ниже.
<app-header></app-header>
<router-outlet></router-outlet>
и затем необходимо добавить в файл spec.ts, как показано ниже.
import { HeaderComponent } from './header/header.component';
describe('AppComponent', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
RouterTestingModule
],
declarations: [
App'enter code here'Component,
HeaderComponent <------------------------
],
}).compileComponents();
}));
});
Ответ 8
У меня была такая же проблема с angular RC.6 по какой-то причине, она не позволяет передавать компонент другому компоненту с помощью директив в качестве декоратора компонентов в родительский компонент
Но если вы импортируете дочерний компонент через модуль приложения и добавьте его в массив объявлений, ошибка исчезнет. Нет никакого объяснения, почему это проблема с angular rc.6
Ответ 9
Другая возможная причина наличия того же сообщения об ошибке - несоответствие между именем тега и именем селектора. Для этого случая:
<header-area></header-area>
имя тега должно точно соответствовать 'header-area'
из объявления компонента:
@Component({
selector: 'header-area',
Ответ 10
Когда у меня возникла эта проблема, это было потому, что я использовал шаблон templateUrl вместо "шаблона" в декораторе, так как я использую webpack и вам нужно использовать require. Просто будьте осторожны с именем декоратора, в моем случае я сгенерировал код шаблона с помощью фрагмента, декоратор был создан как:
@Component({
selector: '',
templateUrl: 'PATH_TO_TEMPLATE'
})
но для webpack декоратор должен быть просто "шаблоном" НЕ 'templateUrl', например:
@Component({
selector: '',
template: require('PATH_TO_TEMPLATE')
})
меняя это, я решил проблему.
Хотите узнать больше о двух методах? прочитайте этот средний пост о template
vs templateUrl
Ответ 11
Я получил эту ошибку, когда у меня было несоответствие экспортированного имени файла и класса:
имя файла: list.component.ts
экспортируемый класс: ListStudentsComponent
Переход от ListStudentsComponent к ListComponent устранил мою проблему.
Ответ 12
Я столкнулся с этой точной проблемой. Failed: Ошибки синтаксического анализа шаблона: 'app-login' не является известным элементом... с ng test
. Я перепробовал все вышеперечисленные ответы: ничего не получалось.
NG ТЕСТОВОЕ РЕШЕНИЕ:
Angular 2 Karma Test 'component-name' не известен как элемент
<= Я добавил объявления для компонентов, нарушающих работу, в beforEach(.. declarations[])
в app.component.spec.ts.
ПРИМЕР app.component.spec.ts
...
import { LoginComponent } from './login/login.component';
...
describe('AppComponent', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
...
],
declarations: [
AppComponent,
LoginComponent
],
}).compileComponents();
...
Ответ 13
У меня была та же проблема, и я исправил, добавив компонент (MyComponentToUse) в массив экспорта в модуле, где был объявлен мой компонент (ModuleLower). Затем я импортирую ModuleLower в ModuleHigher, поэтому теперь я могу повторно использовать мой компонент (MyComponentToUse) в ModuleLower и ModuleHigher.
@NgModule({
declarations: [
MyComponentToUse
],
exports: [
MyComponentToUse
]
})
export class ModuleLower {}
@NgModule({
imports: [
ModuleLower
]
})
export class ModuleHigher {}
Ответ 14
У меня была такая же проблема с Angular 7, когда я собирался уточнить тестовый модуль, объявив тестовый компонент. Просто добавили schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
следующим образом и ошибка была устранена.
TestBed.configureTestingModule({
imports: [ReactiveFormsModule, FormsModule],
declarations: [AddNewRestaurantComponent],
schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
});
Ответ 15
В моем случае ошибка новичка генерировала одно и то же сообщение об ошибке.
Тег app-root
отсутствовал в index.html
Ответ 16
OnInit
был автоматически реализован в моем классе при использовании ключевой фразы ng new ...
в CLI angular для создания нового компонента. Поэтому после того, как я удалил реализацию и удалил пустой метод, который был сгенерирован, проблема решена.
Ответ 17
Для меня путь для templateUrl не был правильным
Я использовал
торгово-список-edit.component.html
Тогда как это должно было быть
./shopping-list-edit.component.html
Глупая ошибка но случается при старте. Надеюсь, что это помогает кому-то в беде.
Ответ 18
Поздний ответ для темы, но я уверен, что есть больше людей, которые могут использовать эту информацию, объясненную в другом ракурсе.
В Ionic пользовательские угловые компоненты организованы в отдельный модуль ComponentsModule
. Когда первый компонент генерируется с использованием ionic generate component
, наряду с компонентом, ионный генерирует ComponentsModule
. Любые последующие компоненты добавляются в тот же модуль, и это правильно.
Вот образец ComponentsModule
import { NgModule } from '@angular/core';
import { CustomAngularComponent } from './custom/custom-angular-component';
import { IonicModule } from 'ionic-angular';
@NgModule({
declarations: [CustomAngularComponent],
imports: [IonicModule],
exports: [CustomAngularComponent],
entryComponents:[
]
})
export class ComponentsModule {}
Чтобы использовать ComponentsModule
в приложении, как и любые другие угловые модули, ComponentsModules
необходимо импортировать в AppModule
. Компонент ионного генерирования (v 4.12) не добавляет этот шаг, поэтому его необходимо добавить вручную.
Выдержка из AppModule:
@NgModule({
declarations: [
//declaration
],
imports: [
//other modules
ComponentsModule,
],
bootstrap: [IonicApp],
entryComponents: [
//ionic pages
],
providers: [
StatusBar,
SplashScreen,
{provide: ErrorHandler, useClass: IonicErrorHandler},
//other providers
]
})
export class AppModule {}
Ответ 19
Для будущих проблем.
Если вы думаете, что следовали всем хорошим ответам, и проблема есть.
Попробуйте выключить и снова включить сервер.
У меня была та же самая проблема, выполнил все шаги, не мог решить ее. Выключите, и это было исправлено.
Ответ 20
Хорошо, позвольте мне дать детали кода, как использовать другой компонент модуля.
Например, у меня есть модуль M2, модуль M2 имеет компонент comp23 и компонент comp2, теперь я хочу использовать comp23 и comp2 в app.module, вот как:
это app.module.ts, смотрите мой комментарий,
// import this module ALL component, but not other module component, only this module
import { AppComponent } from './app.component';
import { Comp1Component } from './comp1/comp1.component';
// import all other module,
import { SwModule } from './sw/sw.module';
import { Sw1Module } from './sw1/sw1.module';
import { M2Module } from './m2/m2.module';
import { CustomerDashboardModule } from './customer-dashboard/customer-dashboard.module';
@NgModule({
// declare only this module all component, not other module component.
declarations: [
AppComponent,
Comp1Component,
],
// imports all other module only.
imports: [
BrowserModule,
SwModule,
Sw1Module,
M2Module,
CustomerDashboardModule // add the feature module here
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
это м2 модуль:
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
// must import this module all component file
import { Comp2Component } from './comp2/comp2.component';
import { Comp23Component } from './comp23/comp23.component';
@NgModule({
// import all other module here.
imports: [
CommonModule
],
// declare only this module child component.
declarations: [Comp2Component, Comp23Component],
// for other module to use these component, must exports
exports: [Comp2Component, Comp23Component]
})
export class M2Module { }
Мои комментарии в коде объясняют, что вам нужно сделать здесь.
Теперь в app.component.html вы можете использовать
<app-comp23></app-comp23>
следовать угловому модулю импорта образца документа