我刚从Angular 2 rc4升级到rc6并且遇到了麻烦。
我在控制台上看到以下错误:
Unhandled Promise rejection: Template parse errors:
'cl-header' is not a known element:
1. If 'cl-header' is an Angular component, then verify that it is part of this module.
2. If 'cl-header' is a Web Component then add "CUSTOM_ELEMENTS_SCHEMA" to the '@NgModule.schema' of this component to suppress this message. ("<main>
[ERROR ->]<cl-header>Loading Header...</cl-header>
<div class="container-fluid">
<cl-feedbackcontai"): AppComponent@1:4
这是我的标题组件:
import { Component } from '@angular/core';
import { Router } from '@angular/router';
// own service
import { AuthenticationService } from '../../../services/authentication/authentication.service.ts';
import '../../../../../public/css/styles.css';
@Component({
selector: 'cl-header',
templateUrl: './header.component.html',
styleUrls: ['./header.component.css']
})
export class HeaderComponent { // more code here... }
这是我的标题模块:
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { RouterModule } from '@angular/router';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { HeaderComponent } from './../../../components/util_components/header/header.component.ts';
@NgModule({
declarations: [ HeaderComponent ],
bootstrap: [ HeaderComponent ],
imports: [ RouterModule, CommonModule, FormsModule ],
schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
})
export class HeaderModule { }
我创建了一个名为util module的包装器模块,它导入了HeaderModule:
import { NgModule } from '@angular/core';
import {HeaderModule} from "./header/header.module";
// ...
@NgModule({
declarations: [ ],
bootstrap: [ ],
imports: [ HeaderModule]
})
export class UtilModule { }
最终由AppModule导入:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import {UtilModule} from "./modules/util_modules/util.module";
import {RoutingModule} from "./modules/routing_modules/routing.module";
@NgModule({
bootstrap: [AppComponent],
declarations: [AppComponent],
imports: [BrowserModule, UtilModule, RoutingModule]
})
export class AppModule { }
根据我的理解,我遵循错误消息的指示使用SCHEMA来克服错误。但它似乎不起作用。我究竟做错了什么? (我希望我现在看不到任何明显的东西。过去6个小时都在升级到这个版本......)
只是想补充一点。
使用新的角度2.0.0最终版本(2016年9月14日),如果您使用自定义html标签,那么它将报告Template parse errors
。自定义标记是您在HTML中使用的标记,它不是these tags中的标记。
看起来需要将schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
行添加到使用自定义HTML标记的每个组件中。
编辑:schemas
声明需要在@NgModule
装饰。下面的示例显示了一个带有自定义组件CustomComponent
的自定义模块,它允许html模板中的任何html标记用于该组件。
custom.module.ts
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { CommonModule } from '@angular/common';
import { CustomComponent } from './custom.component';
@NgModule({
declarations: [ CustomComponent ],
exports: [ CustomComponent ],
imports: [ CommonModule ],
schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
})
export class CustomModule {}
custom.component.ts
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'my-custom-component',
templateUrl: 'custom.component.html'
})
export class CustomComponent implements OnInit {
constructor () {}
ngOnInit () {}
}
custom.component.html
在这里,您可以使用任何您想要的HTML标记。
<div class="container">
<boogey-man></boogey-man>
<my-minion class="one-eyed">
<job class="plumber"></job>
</my-minion>
</div>
这对我不起作用(使用2.0.0)。对我有用的是导入RouterTestingModule。
我通过在spec文件中导入RouterTestingModule解决了这个问题。
import {
RouterTestingModule
} from '@angular/router/testing';
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
App,
AppState,
Renderer,
{provide: Router, useClass: MockRouter }
],
imports: [ RouterTestingModule ]
});
});
对我来说,我需要看一下:
1. If 'cl-header' is an Angular component, then verify that it is part of this module.
这意味着您的组件未包含在app.module.ts
中。确保它已导入,然后包含在declarations
部分。
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import { UtilModule } from "./modules/util_modules/util.module";
import { RoutingModule } from "./modules/routing_modules/routing.module";
import { HeaderComponent } from "./app/components/header.component";
@NgModule({
bootstrap: [AppComponent],
declarations: [
AppComponent,
HeaderComponent
],
imports: [BrowserModule, UtilModule, RoutingModule]
})
export class AppModule { }
对于包含Angular Material的组件,我的单元测试出现了类似的错误。根据@Dan Stirling-Talbert上面的回答,将其添加到我的组件.spec文件中,错误从我的单元测试中清除。
Import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'
然后在生成的beforeEach()语句中添加模式:
beforeEach(asyn(() => {
declarations: [ AboutComponent ],
schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
})
.compileComponents();
}));
我的Karma错误是:如果'mat-panel-title'是Web组件,则将'CUSTOM_ELEMENTS_SCHEMA'添加到此组件的'@NgModule.schemas'以禁止显示此消息。
您是否使用了网络包...如果是,请安装
angular2-template-loader
并把它
test: /\.ts$/,
loaders: ['awesome-typescript-loader', 'angular2-template-loader']
嘿这是固定的做法
a)将schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
添加到每个组件或
b)添加
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
和
schemas: [
CUSTOM_ELEMENTS_SCHEMA
],
到你的模块。
干杯,拉斐尔
如果您正在使用自定义元素测试组件,则在运行单元测试时也会出现这种情况。在这种情况下,需要将custom_elements_schema添加到在该组件的.spec.ts文件开头设置的testingModule中。以下是header.component.spec.ts设置如何开始的示例:
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
describe('HeaderComponent', () => {
let component: HeaderComponent;
let fixture: ComponentFixture<HeaderComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [PrizeAddComponent],
schemas: [
CUSTOM_ELEMENTS_SCHEMA
],
})
.compileComponents();
}));
在@NgModule({})
in'app.module.ts'下添加以下内容:
import CUSTOM_ELEMENTS_SCHEMA from `@angular/core`;
然后
schemas: [
CUSTOM_ELEMENTS_SCHEMA
]
你的'app.module.ts'应如下所示:
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
@NgModule({
declarations: [],
imports: [],
schemas: [ CUSTOM_ELEMENTS_SCHEMA],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
它对我也没有用。我变了
CUSTOM_ELEMENTS_SCHEMA
对于
NO_ERRORS_SCHEMA
这篇文章中提出了这个问题:https://scotch.io/tutorials/angular-2-transclusion-using-ng-content
现在它有效。
util.component.ts
@Component({
selector: 'app-logout',
template: `<button class="btn btn-primary"(click)="logout()">Logout</button>`
})
export class LogoutComponent{}
util.module.ts
@NgModule({
imports: [...],
exports: [
LogoutComponent
],
declarations: [LogoutComponent]
})
export class AccountModule{};
LogoutComponent需要导出
dashboard.module.ts
在我们想要使用来自'util.module'的AccountModule
import {AccountModule}的模块中导入<app-logout>
;
@NgModule({
imports: [
CommonModule, AccountModule
],
declarations: [DashboardComponent]
})
export class DashboardModule { }
dashboard.component.ts
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-dashboard',
template: `<div><app-logout></app-logout></div>`
})
export class DashboardComponent implements OnInit {
constructor() {}
ngOnInit() {}
}
我不需要导入和使用CUSTOM_ELEMENTS_SCHEMA
。
但是当dashboard.module延迟加载时它无法正常工作。
在延迟加载的情况下使用CUSTOM_ELEMENTS_SCHEMA
时,会抑制错误,但组件不会添加到dom中。
只需阅读这篇文章,并根据角度2文档:
export CUSTOM_ELEMENTS_SCHEMA
Defines a schema that will allow:
any non-Angular elements with a - in their name,
any properties on elements with a - in their name which is the common rule for custom elements.
因此,如果有人遇到此问题,一旦您将CUSTOM_ELEMENTS_SCHEMA添加到您的NgModule,请确保您使用的任何新自定义元素在其名称中都有“破折号”,例如。等等
这是一个相当长的帖子,它给出了更详细的问题解释。
问题(在我的情况下)来自你有Multi Slot Content Projection
有关更多信息,请参阅content projection。
例如,如果您有一个如下所示的组件:
html文件:
<div>
<span>
<ng-content select="my-component-header">
<!-- optional header slot here -->
</ng-content>
</span>
<div class="my-component-content">
<ng-content>
<!-- content slot here -->
</ng-content>
</div>
</div>
ts文件:
@Component({
selector: 'my-component',
templateUrl: './my-component.component.html',
styleUrls: ['./my-component.component.scss'],
})
export class MyComponent {
}
你想用它像:
<my-component>
<my-component-header>
<!-- this is optional -->
<p>html content here</p>
</my-component-header>
<p>blabla content</p>
<!-- other html -->
</my-component>
然后你得到的模板解析错误不是已知的Angular组件而事实上并非如此 - 它只是对组件中ng-content的引用:
然后最简单的解决方法是添加
schemas: [
CUSTOM_ELEMENTS_SCHEMA
],
...到你的app.module.ts
但是有一个简单而干净的方法解决这个问题 - 而不是使用<my-component-header>
在插槽中插入html - 你可以使用类名来完成这个任务,如下所示:
html文件:
<div>
<span>
<ng-content select=".my-component-header"> // <--- Look Here :)
<!-- optional header slot here -->
</ng-content>
</span>
<div class="my-component-content">
<ng-content>
<!-- content slot here -->
</ng-content>
</div>
</div>
你想用它像:
<my-component>
<span class="my-component-header"> // <--- Look Here :)
<!-- this is optional -->
<p>html content here</p>
</span>
<p>blabla content</p>
<!-- other html -->
</my-component>
所以......没有更多的组件不存在所以没有问题,没有错误,app.module.ts中不需要CUSTOM_ELEMENTS_SCHEMA
有关此问题的更多信息 - https://github.com/angular/angular/issues/11251
有关角度内容投影的更多信息 - https://blog.angular-university.io/angular-ng-content/
你也可以看到https://scotch.io/tutorials/angular-2-transclusion-using-ng-content
我想添加一条额外的信息,因为上面接受的答案并没有完全解决我的错误。
在我的场景中,我有一个父组件,它包含一个子组件。那个子组件还包含另一个组件。
因此,我的父组件的spec文件需要具有子组件的声明,以及孩子的儿童组件。这最终解决了我的问题。