Angular2 CUSTOM_ELEMENTS_SCHEMA不起作用

时间:2017-02-19 03:48:40

标签: angular angular-components

我刚刚使用ng2 cli安装了一个bearbones ng2 app。在我的AppModule我添加了schema: [ CUSTOM_ELEMENTS_SCHEMA ],在我的AppComponent模板中,我有<row></row>。但是我得到了 -

  

未处理的承诺拒绝:模板解析错误:   &#39;行&#39;不是一个已知的元素:   1.如果&#39; row&#39;是一个Angular组件,然后验证它是否是此模块的一部分。   2.如果&#39; row&#39;是一个Web组件,然后添加&#34; CUSTOM_ELEMENTS_SCHEMA&#34;到了&#39; @ NgModule.schemas&#39;此组件禁止此消息。 (&#34; [错误 - &gt;]

的AppModule -

import { BrowserModule } from '@angular/platform-browser';
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';

import { AppComponent } from './app.component';


@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule
  ],
  providers: [],
  bootstrap: [AppComponent],
  schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
})
export class AppModule { }

AppComponent -

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {}

AppComponentTemplate -

<row></row>

真的那么简单。到底是怎么回事?

修改

以下所有答案都令人满意,并提供了对问题的深入了解。 @yurzui我特别喜欢你提供源代码的答案。我希望我能给你所有接受的答案!但我会选择@camaron作为第一个并直接解决我的问题。如果您通过谷歌找到这个问题,请给@yurzui,@camaron和@Aravind +1以帮助解决这个问题!

3 个答案:

答案 0 :(得分:12)

您需要添加RowComponent

要导入的AppModule

imports: [RowComponent]

编辑:

使用NO_ERRORS_SCHEMA,这是因为angular正在尝试查找不存在的组件。

CUSTOM_ELEMENTS_SCHEMA适用于选择器名称中包含-的组件。

答案 1 :(得分:5)

如果您查看更改日志https://github.com/angular/angular/blob/master/CHANGELOG.md#200-rc5-2016-08-09

  

默认情况下,Angular在解析未知属性时会出错,   即使,如果他们的名字中包含 - ,名称 (又名自定义)   的元素)即可。如果您的应用程序使用自定义元素,请填写新元素   参数@ NgModule.schemas,其值为[CUSTOM_ELEMENTS_SCHEMA]。

然后您就可以理解,您需要使用-分隔符

标记
if (tagName.indexOf('-') > -1) {
      if (tagName === 'ng-container' || tagName === 'ng-content') {
        return false;
      }

      if (schemaMetas.some((schema) => schema.name === CUSTOM_ELEMENTS_SCHEMA.name)) {
        // Can't tell now as we don't know which properties a custom element will get
        // once it is instantiated
        return true;
      }
}

https://github.com/angular/angular/blob/2.4.8/modules/%40angular/compiler/src/schema/dom_element_schema_registry.ts#L290

所以像my-row这样的东西应该起作用

答案 2 :(得分:3)

以下是您的错误

  1. 您只导入了 AppComponent ,但它没有任何以<row>为模板的元素。
  2. CUSTOM_ELEMENTS_SCHEMA 不需要在应用程序开发期间使用,因为它用于隐藏在解析模板时发生的错误(如错误描述中所述)。
  3. <app-root>是AppComponent的选择器,但您在AppComponent的html中使用了<row>
  4. 根据您的要求,我可以提出各种修正建议。评论您想要的结果,我将根据它们更新答案。