Пользовательские элементы схемы добавлены в NgModule.схемы все еще показывают ошибку
Я только что обновился с 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 { }
который наконец-то импортируются в модуль:
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 { }
в моем понимании я следую инструкции сообщения об ошибке с помощью схемы для преодоления ошибки. Но это, кажется, не работает. Что я делаю не так? (Я надеюсь, что ничего очевидного я просто не вижу в данный момент. Потратил последние 6 часов на обновление до этой версии...)
12 ответов:
просто хотел добавить немного больше об этом.
С новым выпуском angular 2.0.0 final (Сентябрь 14, 2016), Если вы используете пользовательские теги html, то он сообщит, что
Template parse errors
. Пользовательский тег-это тег, который вы используете в своем HTML, который не является одним из теги.похоже на строку
schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
необходимо добавить в каждый компонент, где вы используете пользовательские теги HTML.EDIT: The
schemas
объявление должно быть в@NgModule
оформитель. В приведенном ниже примере показан пользовательский модуль с пользовательским компонентомCustomComponent
который позволяет любой HTML-тег в шаблоне html для этого одного компонента.таможни.модуль.ТС
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 {}
таможни.деталь.ТС
import { Component, OnInit } from '@angular/core'; @Component({ selector: 'my-custom-component', templateUrl: 'custom.component.html' }) export class CustomComponent implements OnInit { constructor () {} ngOnInit () {} }
таможни.деталь.HTML-код
здесь вы можете использовать любой HTML-тег, который вы хотите.
<div class="container"> <boogey-man></boogey-man> <my-minion class="one-eyed"> <job class="plumber"></job> </my-minion> </div>
Эй это делать
a) добавление
schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
для каждого из компонентов илиb) добавление
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
и
schemas: [ CUSTOM_ELEMENTS_SCHEMA ],
в свой модуль.
Ура, Рафаэль
это работает для меня таким образом:
в "приложение.модуль.ТС" :
1-
import CUSTOM_ELEMENTS_SCHEMA from `@angular/core` file ;
2 - Добавить
schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
до
@NgModule({})
--------------------------------------------------------->
"приложения.модуль.ts " будет выглядеть так:
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; @NgModule({ declarations: [], imports: [], schemas: [ CUSTOM_ELEMENTS_SCHEMA], providers: [], bootstrap: [AppComponent] })
экспортировать класс модуль { }
Это также может возникнуть при выполнении модульных тестов, если вы тестируете компонент с пользовательскими элементами. В этом случае custom_elements_schema должен быть добавлен в testingModule, который получает setup в начале .спекуляция.TS файл для этого компонента. Вот пример того, как заголовок.деталь.спекуляция.настройка 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(); }));
это тоже не сработало для меня. Я изменился
CUSTOM_ELEMENTS_SCHEMA
на
NO_ERRORS_SCHEMA
который был предложен в этой статье: https://scotch.io/tutorials/angular-2-transclusion-using-ng-content
теперь все работает.
util.деталь.ТС
@Component({ selector: 'app-logout', template: `<button class="btn btn-primary"(click)="logout()">Logout</button>` }) export class LogoutComponent{}
util.модуль.ТС
@NgModule({ imports: [...], exports: [ LogoutComponent ], declarations: [LogoutComponent] }) export class AccountModule{};
LogoutComponent должен быть экспортирован
панель управления.модуль.ТС
импортAccountModule
в модуле, где мы хотим использовать<app-logout>
импорт { AccountModule } из ' util.модуль';@NgModule({ imports: [ CommonModule, AccountModule ], declarations: [DashboardComponent] }) export class DashboardModule { }
панель управления.деталь.ТС
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
.
однако его не работает, когда приборная панель.модуль лениво загружен.
При использованииCUSTOM_ELEMENTS_SCHEMA
в случае ленивой загрузки ошибка подавляется, но компонент не добавляется в dom.
просто прочитайте этот пост и в соответствии с угловыми 2 docs:
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, убедитесь, что любой новый пользовательский элемент, который вы используете, имеет "тире" в своем имени, например. или так далее.
Я хотел бы добавить еще одну дополнительную информацию, так как принятый ответ выше не исправил мои ошибки полностью.
в моем сценарии у меня есть родительский компонент, который содержит дочерний компонент. И этот дочерний компонент также содержит другой компонент.
Итак, файл спецификации моего родительского компонента должен иметь объявление дочернего компонента, а также дочернего компонента ребенка. Это, наконец, исправило проблему для меня.
это довольно длинный пост, и он дает более подробное объяснение проблемы.
проблема (в моем случае) приходит, когда у вас есть Проекция Содержимого Нескольких Слотов
см. также проекция контент для получения дополнительной информации.
например, если у вас есть компонент, который выглядит так:
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>
@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>
и тогда вы получаете ошибки разбора шаблона, которые не являются известным угловым компонентом, и на самом деле это не так - это просто ссылка на NG-контент в вашем компоненте:
и тогда самое простое исправление-это добавление
schemas: [ CUSTOM_ELEMENTS_SCHEMA ],
... к вашему приложению.модуль.ТС
но есть простой и чистый подход к этой проблеме - вместо того, чтобы использовать
<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 в приложении.модуль.ТС
Итак, если вы были похожи на меня и не хотели добавлять 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
Это не сработало для меня (используя 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 ] }); });
для меня, мне нужно смотреть на :
1. If 'cl-header' is an Angular component, then verify that it is part of this module.
это значит, что ваш компонент не входит в
app.module.ts
. Убедитесь, что он импортирован, а затем включен в .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 { }