CUSTOM_ELEMENTS_SCHEMA添加到NgModule.schemas仍显示错误


137

我刚刚从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模块的包装器模块,该模块导入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个小时一直在升级到此版本...)


1
如果将其AppModule添加到您的组件中,还需要将其添加到您的组件中吗?
亚历山德罗·雷斯塔

1
在这里也一样,对我来说,只需添加“ schemas:[CUSTOM_ELEMENTS_SCHEMA]”就可以了。谢谢:)
AIon

3
如果您将“修复”添加为对此问题的答案,将对您有所帮助,以便其他遇到您问题的人可以清楚地知道他们如何从使用您的解决方案中受益:]
Danny Bullis

Answers:


97

只是想在此添加更多一点。

在新的angular 2.0.0最终版本(2016年9月14日)中,如果您使用自定义html标签,则它将报告该Template parse errors。自定义标记是您在HTML中使用的标记,不是这些标记之一

看起来该行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>

我有一个非常简单的应用程序,在一个模块中有多个组件。我已将其添加到模块中...我仍然会收到错误...
Nicolas Irisarri

7
谢谢迦勒。运行简单测试时出现错误。我发现了……但是我没有将它添加CUSTOM_ELEMENTS_SCHEMA到我的单元测试假模块中。我这样做后,便不再抱怨。
Nicolas Irisarri

1
有没有一种方法可以定义允许的自定义元素?使用CUSTOM_ELEMENTS_SCHEMA可能会导致很难发现的错误,但是我想ng-content在控件的各个部分中使用自定义元素名称,而这些特定的元素名称不会导致错误,也不会为它们创建只是ng-content的组件...
Jason Goemaat

1
@Caleb能否提供一个简短的代码示例,说明您的意思?似乎schemas: [ CUSTOM_ELEMENTS_SCHEMA ]需要在使用HTML标签的每个组件中添加该行Component装饰器似乎不接受schemas参数。
丹尼·布利斯

2
嘿@DannyBullis,而不是Component装饰器,可以在NgModule装饰器中找到。您需要为该组件创建一个模块,然后可以在其中指定架构。链接到文档和示例。
卡雷布(Caleb)

85

这是通过以下方式解决的:

a)添加schemas: [ CUSTOM_ELEMENTS_SCHEMA ]到每个组件或

b)添加

import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';

schemas: [
  CUSTOM_ELEMENTS_SCHEMA
],

到您的模块。


7
别忘了声明它...它位于@ angular / core中。像这样的东西应该适合:import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
rlasjunies '16

这篇文章可以与程序帮助遵循:medium.com/google-developer-experts/...
卡洛斯é

1
向每个组件添加模式:[CUSTOM_ELEMENTS_SCHEMA],就成功了!谢谢!
Pedro Ferreira

模式在角度9中不存在
Renil Babu

37

如果要使用自定义元素测试组件,则在运行单元测试时也会出现这种情况。在这种情况下,需要将custom_elements_schema添加到testing.Module中,该模块在该组件的.spec.ts文件的开头进行设置。这是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();
  }));

1
谢谢!我花了太多时间#&@%才找到这个。
凌晨

23

@NgModule({})在'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 { }

2
但现在您的整个应用都允许使用自定义标签。
EE33年

10

这对我也不起作用。我变了

CUSTOM_ELEMENTS_SCHEMA

对于

NO_ERRORS_SCHEMA

本文建议的内容:https : //scotch.io/tutorials/angular-2-transclusion-using-ng-content

现在可以了。


真好!它为我工作。我想在组件HTML上添加XML元素,但出现错误。非常感谢
Celso Soares '18

在角度元素(角度8)中的角度元素中使用角度元素时,添加操作CUSTOM_ELEMENTS_SCHEMA并没有帮助,但NO_ERRORS_SCHEMA确实做到了,所有独立角度元素的嵌套现在都像一个魅力一样工作
瑜伽士

这对我有用TestBed。元素工作正常,但测试失败。添加了schemas: [NO_ERRORS_SCHEMA],一切都很好。
VSO

9

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
导入AccountModule模块,我们要在其中使用<app-logout> 从'util.module'导入import {AccountModule};

@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。


idem +1不再发生错误,但没有dom更新了,这种尝试使带有'-'的选择器起作用的解决方法是#### !!! &&ù* $
user1568220

1
非常感谢,一周之后,我发现它不能与离子中的延迟加载一起使用
Amr.Ayoub

1
@Arun-您的解决方案是100%准确的,1)需要添加到导出中,2)不需要custom_elements_schema
Ashwin

我遇到了相同的错误,并在声明子句中需要的每个模块中设置了组件。我没有使用CUSTOM_ELEMENTS_SCHEMA而已。
戴维(David)

6

对于包含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”以禁止显示此消息。


4

只需阅读这篇文章,并根据角度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后,请确保使用的任何新自定义元素的名称均带有“破折号”。或其他


1
名称中的破折号?为什么要强加这样愚蠢的约定?
Meryan

我仅在刚开始在Ionic3中使用延迟加载并且仅在尝试为Web构建时才遇到此问题。可以将链接发布到您提到的文档中。谢谢。
Meryan

3

这是一篇很长的文章,它提供了对该问题的更详细说明。

当您使用多槽内容投影时,就会出现问题(就我而言)

另请参阅内容投射

例如,如果您有一个如下所示的组件:

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:

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

因此,如果您像我一样,并且不想将CUSTOM_ELEMENTS_SCHEMA添加到模块中,则使用这种方式不会产生错误并且更加清楚。

有关此问题的更多信息-https: //github.com/angular/angular/issues/11251

有关Angular内容投影的更多信息-https: //blog.angular-university.io/angular-ng-content/

您还可以看到https://scotch.io/tutorials/angular-2-transclusion-using-ng-content


1
这就是我一直在寻找的东西,谢谢分享!
romeouald

1

我想补充一条信息,因为上面接受的答案无法完全解决我的错误。

在我的方案中,我有一个父组件,其中包含一个子组件。该子组件还包含另一个组件。

因此,我的父组件的规范文件需要具有子组件的声明,以及孩子的孩子组件。终于为我解决了这个问题。


1

我认为您正在使用自定义模块。您可以尝试以下方法。您需要将以下内容添加到文件your-module.module.ts中

import { GridModule } from '@progress/kendo-angular-grid';
@NgModule({
  declarations: [ ],
  imports: [ CommonModule, GridModule ],
  exports: [ ],
})

0

这对我不起作用(使用2.0.0)。对我有用的是改为导入RouterTestingModule。

我通过在规格文件中导入RouterTestingModule解决了这一问题。

import {
    RouterTestingModule
} from '@angular/router/testing';

  beforeEach(() => {

        TestBed.configureTestingModule({
            providers: [
                App,
                AppState,
                Renderer,
                {provide: Router,  useClass: MockRouter }
            ],
            imports: [ RouterTestingModule ]
        });

    });

0

对我来说,我需要看一下:

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

0

我刚导入ClarityModule,它解决了所有问题。试试看!

import { ClarityModule } from 'clarity-angular';

另外,在导入中包含模块。

imports: [ ClarityModule ],


嘿,依沙尼 您能否也请解释一下它为什么起作用?
f.khantsis

如果我们访问angular.io/api/core/CUSTOM_ELEMENTS_SCHEMA的文档CUSTOM_ELEMENTS_SCHEMA,我们会发现CUSTOM_ELEMENTS_SCHEMA允许NgModule包含带有破折号(-)的非Angular元素(类似于这种情况)。导入时,“清晰度模块”默认情况下包括所有clr图标,等等,我们还可以使用“清晰度”模块的其他功能。
伊沙尼

这与这里的问题无关。您如何通过导入清晰度模块来解决它?@Ishani
HelloWorld

如果您阅读问题说明,Angular将无法识别clr-header。同样的错误也会给您带来clr-icon其他错误。正如我在之前的评论中提到的那样,Clarity模块默认包含这些内容。希望它回答了您的问题。
Ishani

0

解决了/app/app.module.ts文件中的此问题

导入您的组件并声明它

import { MyComponent } from './home-about-me/my.component';

@NgModule({
  declarations: [
    MyComponent,
  ]

-3

您是否使用过Webpack ...如果是,请安装

angular2-template-loader

并把它

test: /\.ts$/,
   loaders: ['awesome-typescript-loader', 'angular2-template-loader']

我无法对由ng g生成的组件创建的默认测试进行路径设置,并得到相同的错误。从这个主题出发,没有什么没有帮助的:(我只有在被评论组件规格文件时才摘下一个错误:(
Nesquik27 2018年

我了解对,自定义标签仅适用于v2以下的语言?!我已经检查了youtube中的内容,并尝试在v4环境中从v2测试我的代码
Nesquik27 '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.