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 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 часов я потратил на обновление до этой версии ...)

Рафаэль Хиппе
источник
1
Если вы добавите его в свой AppModule, вам все равно придется добавить его в свой компонент?
Алессандро Реста
1
то же самое здесь, для меня просто добавление "схемы: [CUSTOM_ELEMENTS_SCHEMA]" работает как шарм. Спасибо :)
AIon
3
Было бы полезно, если бы вы добавили свое «Исправление» в качестве ответа на этот вопрос, чтобы другим, кто сталкивался с вашим вопросом, было ясно, какую именно пользу они могут получить от использования вашего решения:]
Дэнни Буллис,

Ответы:

97

Просто хотел добавить немного больше об этом.

В новом выпуске angular 2.0.0 (14 сентября 2016 г.), если вы используете пользовательские теги html, он сообщит об этом Template parse errors. Пользовательский тег - это тег, который вы используете в своем HTML, но он не является одним из этих тегов .

Похоже, что строка schemas: [ CUSTOM_ELEMENTS_SCHEMA ]должна быть добавлена ​​к каждому компоненту, где вы используете пользовательские теги HTML.

EDIT: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модуль поддельного теста в мой модуль. Как только я это сделал, он перестал жаловаться.
Николас Ирисарри
1
Есть ли способ определить пользовательские элементы, которые разрешены? Использование CUSTOM_ELEMENTS_SCHEMAможет привести к ошибкам, которые трудно найти, но я хотел бы использовать настраиваемые имена элементов для ng-contentразделов в моих элементах управления без конкретных имен элементов, вызывающих ошибки, и без создания для них компонентов, которые были бы просто ng-content ...
Джейсон Goemaat
1
@Caleb, не могли бы вы привести краткий пример кода того, что вы имеете в виду. Похоже, что строку schemas: [ CUSTOM_ELEMENTS_SCHEMA ]необходимо добавить в каждый компонент, где вы используете HTML-теги ? Похоже, Componentдекоратор не принимает schemasпараметр.
Дэнни Буллис
2
Привет @DannyBullis, вместо Componentдекоратора, он найден в NgModuleдекораторе. Вам нужно создать модуль для этого компонента, а затем вы можете указать схему там. Ссылка на документы и пример.
Калеб
85

Это исправлено:

а) добавление schemas: [ CUSTOM_ELEMENTS_SCHEMA ]к каждому компоненту или

б) добавление

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

и

schemas: [
  CUSTOM_ELEMENTS_SCHEMA
],

к вашему модулю.

Рафаэль Хиппе
источник
7
не забудьте объявить это ... он находится в @ angular / core. Нечто подобное должно соответствовать:import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
rlasjunies
Этот пост мог бы помочь с процедурой, которой нужно следовать: medium.com/google-developer-experts/…
Carlos E
1
добавив схемы: [CUSTOM_ELEMENTS_SCHEMA] к КАЖДОМУ компоненту, сделали свое дело! Спасибо!
Педро Феррейра
схемы не существуют в угловых 9
Ренил Бабу
37

Это также может возникнуть при запуске модульных тестов, если вы тестируете компонент с пользовательскими элементами. В этом случае custom_elements_schema необходимо добавить в модуль testingModule, который запускается в начале файла .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
Спасибо! У меня слишком много времени ушло на то, чтобы найти это.
eflat
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

Теперь это работает.

Мартин Кремер
источник
Ницца! Это сработало для меня. Я хотел добавить элементы XML в свой компонент HTML, и я получал ошибки. Большое спасибо
Селсо Соареш
служил угловым элементам в угловых элементах в угловых элементах (Angular 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 Нужно экспортировать


импортAccountModule<app-logout> dashboard.module.ts в модуле, где мы хотим использовать import {AccountModule} из 'util.module';

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

Arun
источник
То же +1, больше нет ошибок, но больше не нужно обновлять dom, этот обходной путь для попытки заставить эти селекторы работать с '-' - #### !!! && ù * $
user1568220
1
Большое спасибо, после недели я обнаружил, что он не может работать с ленивой загрузкой в ​​ionic
Amr.Ayoub
1
@Arun - ваше решение 100% точное, 1) нужно добавить к экспорту и 2) не нуждается в custom_elements_schema
Ashwin
У меня была та же ошибка, и я установил свои компоненты в каждом модуле, где мне было нужно в декларации clausule. Я не использовал CUSTOM_ELEMENTS_SCHEMA и работал.
Дэвид
6

С компонентами, содержащими Angular Material, похожая ошибка возникла при моих модульных тестах. В соответствии с ответом @Dan Stirling-Talbert выше, я добавил это в мой файл .spec компонента, и ошибка была очищена из моих модульных тестов.

Import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'

Затем добавьте схему в сгенерированный оператор beforeEach ():

beforeEach(asyn(() => {
    declarations: [ AboutComponent ],
    schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
})
.compileComponents();
}));

Моя ошибка кармы: если 'mat-panel-title' является веб-компонентом, то добавьте '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, убедитесь, что у любого нового пользовательского элемента, который вы используете, есть «тире» в его имени, например. или т. д.

Хьюго 1005
источник
1
Тире в имени? Зачем навязывать такое глупое соглашение?
Мерян
Я сталкиваюсь с этим только тогда, когда я только начал использовать ленивую загрузку в Ionic3 и только когда я пытаюсь собрать для Интернета. Не могли бы вы опубликовать ссылку на документы, которые вы упоминаете. Спасибо.
Мерян
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-контент в вашем компоненте:

И тогда самое простое исправление - это добавление

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>

Итак ... больше нет компонентов, которые не существуют, поэтому в этом нет проблем, нет ошибок, нет необходимости в CUSTOM_ELEMENTS_SCHEMA в 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

скомбинировать
источник
1
это было именно то, что я искал, спасибо, что поделились!
Ромеоальд
1

Я хотел бы добавить еще одну информацию, поскольку принятый ответ не полностью исправил мои ошибки.

В моем сценарии у меня есть родительский компонент, который содержит дочерний компонент. И этот дочерний компонент также содержит другой компонент.

Итак, файл спецификации моего родительского компонента должен иметь объявление дочернего компонента, КАК ХОРОШО, КАК КОМПОНЕНТ РЕБЕНКА CHILD. Это наконец решило проблему для меня.

гусаки
источник
1

Я думаю, что вы используете пользовательский модуль. Вы можете попробовать следующее. Вам необходимо добавить следующее в файл your-module.module.ts :

import { GridModule } from '@progress/kendo-angular-grid';
@NgModule({
  declarations: [ ],
  imports: [ CommonModule, GridModule ],
  exports: [ ],
})
Vương Hữu Thiện
источник
0

Это не сработало для меня (используя 2.0.0). То, что работало для меня, было импортировать RouterTestingModule вместо этого.

Я решил это, импортировав RouterTestingModule в spec-файл.

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

  beforeEach(() => {

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

    });
HMagdy
источник
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 ],

Ishani
источник
Привет, Ишани. Не могли бы вы также добавить объяснение, почему это работает?
Ф.Ханцис
Если мы посетим документацию по CUSTOM_ELEMENTS_SCHEMAадресу angular.io/api/core/CUSTOM_ELEMENTS_SCHEMA, то обнаружим, что CUSTOM_ELEMENTS_SCHEMA позволяет NgModule содержать неугловые элементы с тире (-) {аналогично этому сценарию}. Модуль Clarity при импорте включает в себя все значки clr и т. Д. По умолчанию, и мы также можем использовать другие функции модуля понятности.
Ишани
Это не имеет отношения к проблеме здесь. Как вы решаете это путем импорта модуля ясности ?? @Ishani
HelloWorld
если вы прочитаете формулировку проблемы, Angular не сможет определить clr-header. Та же ошибка возникает и для clr-iconдругих. Как я уже упоминал в предыдущем комментарии, модуль Clarity по умолчанию содержит их. Я надеюсь, что он ответил на ваш вопрос.
Ишани
0

решил эту проблему в файле /app/app.module.ts

импортировать ваш компонент и объявить его

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

@NgModule({
  declarations: [
    MyComponent,
  ]
Луис Лобо
источник
-3

Вы использовали веб-пакет ... если да, пожалуйста, установите

angular2-template-loader

и положи

test: /\.ts$/,
   loaders: ['awesome-typescript-loader', 'angular2-template-loader']
Imanullah
источник
Я не могу найти пути тестов по умолчанию, которые были созданы компонентом, генерирующим ng g, и получили ту же ошибку. Ничто из этой темы не помогло :( Я
снимаю
Я правильно понимаю, что пользовательские теги работали только с угловыми ниже v2 ?! Я проверил что-то в YouTube, и я пытаюсь проверить свой код от v2 в среде v4
Nesquik27