Ich habe gerade ein Upgrade von Angular 2 rc4 auf rc6 durchgeführt und habe Probleme damit.
Auf meiner Konsole wird der folgende Fehler angezeigt:
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
Hier ist meine Header-Komponente:
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... }
Hier ist mein Header-Modul:
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 { }
Ich habe ein Wrapper-Modul namens util-Modul erstellt, das das HeaderModule importiert:
import { NgModule } from '@angular/core';
import {HeaderModule} from "./header/header.module";
// ...
@NgModule({
declarations: [ ],
bootstrap: [ ],
imports: [ HeaderModule]
})
export class UtilModule { }
Was schließlich vom AppModule importiert wird:
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 { }
Nach meinem Verständnis folge ich den Anweisungen der Fehlermeldung und benutze das SCHEMA, um den Fehler zu unterdrücken. Aber es scheint nicht zu funktionieren. Was mache ich falsch? (Ich hoffe, es ist nichts Offensichtliches, was ich im Moment einfach nicht sehe. Ich habe die letzten 6 Stunden damit verbracht, auf diese Version zu aktualisieren ...)
angular
karma-jasmine
Raphael Hippe
quelle
quelle
AppModule
es zu Ihrer Komponente hinzufügen, müssen Sie es dennoch zu Ihrer Komponente hinzufügen?Antworten:
Ich wollte nur ein bisschen mehr dazu hinzufügen.
Wenn Sie mit der neuen endgültigen Version von Angular 2.0.0 (14. September 2016) benutzerdefinierte HTML-Tags verwenden, wird dies gemeldet
Template parse errors
. Ein benutzerdefiniertes Tag ist ein Tag, das Sie in Ihrem HTML-Code verwenden und das nicht zu diesen Tags gehört .Es sieht so aus, als
schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
müsste die Zeile zu jeder Komponente hinzugefügt werden, in der Sie benutzerdefinierte HTML-Tags verwenden.EDIT: Die
schemas
Erklärung muss in einem@NgModule
Dekorateur sein. Das folgende Beispiel zeigt ein benutzerdefiniertes Modul mit einer benutzerdefinierten KomponenteCustomComponent
, die ein beliebiges HTML-Tag in der HTML-Vorlage für diese eine Komponente zulässt.custom.module.ts
custom.component.ts
custom.component.html
Hier können Sie jedes gewünschte HTML-Tag verwenden.
quelle
CUSTOM_ELEMENTS_SCHEMA
zu meinem Unit-Test-Fake-Modul hinzugefügt . Sobald ich das tat, hörte es auf, sich zu beschweren.CUSTOM_ELEMENTS_SCHEMA
kann zu Fehlern führen, die schwer zu finden sind. Ich möchte jedoch benutzerdefinierte Elementnamen fürng-content
Abschnitte in meinen Steuerelementen verwenden, ohne dass diese spezifischen Elementnamen Fehler verursachen, und ohne Komponenten für sie zu erstellen, die nur ng-Inhalt sind ...schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
müsste die Zeile zu jeder Komponente hinzugefügt werden, in der Sie HTML-Tags verwenden . Es sieht so aus, als würde derComponent
Dekorateur keinenschemas
Parameter akzeptieren .Component
Dekorateurs befindet es sich imNgModule
Dekorateur. Sie müssen ein Modul für diese Komponente erstellen und können dort das Schema angeben. Link zu Dokumenten und einem Beispiel.Dies wird behoben durch:
a) Hinzufügen
schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
zu jeder Komponente oderb) Hinzufügen
und
zu Ihrem Modul.
quelle
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
Dies kann auch beim Ausführen von Komponententests auftreten, wenn Sie eine Komponente mit benutzerdefinierten Elementen testen. In diesem Fall muss custom_elements_schema zum Testmodul hinzugefügt werden, das am Anfang der Datei .spec.ts für diese Komponente eingerichtet wird. Hier ist ein Beispiel dafür, wie das Setup von header.component.spec.ts beginnen würde:
quelle
Fügen Sie unter
@NgModule({})
'app.module.ts' Folgendes hinzu:und dann
Ihre 'app.module.ts' sollte folgendermaßen aussehen:
quelle
Es hat auch bei mir nicht funktioniert. ich habe mich verändert
zum
Dies wurde in diesem Artikel vorgeschlagen: https://scotch.io/tutorials/angular-2-transclusion-using-ng-content
Jetzt gehts.
quelle
CUSTOM_ELEMENTS_SCHEMA
hat nicht geholfen,NO_ERRORS_SCHEMA
aber den Trick getan, und das Verschachteln von eigenständigen Winkelelementen funktioniert jetzt wie ein ZauberTestBed
. Element funktionierte gut, aber der Test schlug fehl. Hinzugefügtschemas: [NO_ERRORS_SCHEMA]
, und es ist alles gut.util.component.ts
util.module.ts
LogoutComponent Muss exportiert werden
dashboard.module.ts
Import
AccountModule
in Modul, in dem<app-logout>
import {AccountModule} aus 'util.module' verwendet werden soll;dashboard.component.ts
Ich muss nicht importieren und verwenden
CUSTOM_ELEMENTS_SCHEMA
.Es funktioniert jedoch nicht, wenn dashboard.module faul geladen ist.
Bei Verwendung
CUSTOM_ELEMENTS_SCHEMA
im Falle eines verzögerten Ladens wird ein Fehler unterdrückt, aber die Komponente wird nicht zu dom hinzugefügt.quelle
Bei Komponenten, die Angular Material enthalten, trat bei meinen Komponententests ein ähnlicher Fehler auf. Gemäß der obigen Antwort von @Dan Stirling-Talbert wurde dies zu meiner .spec-Komponentendatei hinzugefügt, und der Fehler wurde aus meinen Komponententests behoben.
Fügen Sie dann das Schema in die generierte beforeEach () -Anweisung ein:
Mein Karma-Fehler war: Wenn 'mat-panel-title' eine Webkomponente ist, fügen Sie 'CUSTOM_ELEMENTS_SCHEMA' zu '@ NgModule.schemas' dieser Komponente hinzu, um diese Nachricht zu unterdrücken.
quelle
Lesen Sie einfach diesen Beitrag und gemäß den eckigen 2 Dokumenten:
Für den Fall, dass jemand auf dieses Problem stößt, stellen Sie nach dem Hinzufügen von CUSTOM_ELEMENTS_SCHEMA zu Ihrem NgModule sicher, dass jedes neue benutzerdefinierte Element, das Sie verwenden, einen Bindestrich im Namen hat, z. oder etc.
quelle
Dies ist ein ziemlich langer Beitrag, der eine detailliertere Erklärung des Problems enthält.
Das Problem (in meinem Fall) tritt auf, wenn Sie eine Multi Slot Content Projection haben
Siehe auch Inhaltsprojektion für weitere Informationen.
Zum Beispiel, wenn Sie eine Komponente haben, die so aussieht:
HTML-Datei:
ts Datei:
Und Sie möchten es wie folgt verwenden:
Und dann erhalten Sie Fehler beim Analysieren von Vorlagen, bei denen es sich nicht um eine bekannte Angular-Komponente handelt, und tatsächlich nicht - es handelt sich lediglich um einen Verweis auf einen ng-Inhalt in Ihrer Komponente:
Und dann ist die einfachste Lösung das Hinzufügen
... zu Ihrer app.module.ts
Es gibt jedoch einen einfachen und übersichtlichen Ansatz für dieses Problem. Anstatt
<my-component-header>
HTML in den dortigen Steckplatz einzufügen, können Sie für diese Aufgabe einen Klassennamen wie den folgenden verwenden:HTML-Datei:
Und Sie möchten es wie folgt verwenden:
Also ... keine Komponenten mehr, die nicht existieren, also gibt es keine Probleme, keine Fehler, keine Notwendigkeit für CUSTOM_ELEMENTS_SCHEMA in app.module.ts
Wenn Sie also wie ich waren und CUSTOM_ELEMENTS_SCHEMA nicht zum Modul hinzufügen wollten, führt die Verwendung Ihrer Komponente auf diese Weise nicht zu Fehlern und ist klarer.
Weitere Informationen zu diesem Problem finden Sie unter https://github.com/angular/angular/issues/11251
Weitere Informationen zur Projektion von Angular-Inhalten finden Sie unter https://blog.angular-university.io/angular-ng-content/.
Sie können auch https://scotch.io/tutorials/angular-2-transclusion-using-ng-content sehen
quelle
Ich möchte eine zusätzliche Information hinzufügen, da die oben akzeptierte Antwort meine Fehler nicht vollständig behoben hat.
In meinem Szenario habe ich eine übergeordnete Komponente, die eine untergeordnete Komponente enthält. Und diese untergeordnete Komponente enthält auch eine andere Komponente.
Die Spezifikationsdatei meiner übergeordneten Komponente muss also die Deklaration der untergeordneten Komponente sowie die KINDERKOMPONENTE DES KINDES enthalten. Das hat das Problem für mich endlich behoben.
quelle
Ich denke, Sie verwenden ein benutzerdefiniertes Modul. Sie können Folgendes versuchen. Sie müssen der Datei your-module.module.ts Folgendes hinzufügen :
quelle
Das hat bei mir nicht funktioniert (mit 2.0.0). Was für mich funktioniert hat, war stattdessen RouterTestingModule zu importieren.
Ich habe dieses Problem behoben, indem ich RouterTestingModule in die Spezifikationsdatei importiert habe.
quelle
Für mich musste ich schauen:
1. If 'cl-header' is an Angular component, then verify that it is part of this module.
Dies bedeutet, dass Ihre Komponente nicht in der enthalten ist
app.module.ts
. Stellen Sie sicher, dass es importiert und dann in dendeclarations
Abschnitt aufgenommen wird.quelle
Ich habe gerade importiert
ClarityModule
und es hat alle Probleme gelöst. Versuche es!Nehmen Sie das Modul auch in die Importe auf.
imports: [ ClarityModule ],
quelle
CUSTOM_ELEMENTS_SCHEMA
unter angle.io/api/core/CUSTOM_ELEMENTS_SCHEMA besuchen , werden wir feststellen, dass CUSTOM_ELEMENTS_SCHEMA es NgModule ermöglicht, Nicht-Angular-Elemente mit Bindestrich (-) {ähnlich wie in diesem Szenario} zu enthalten. Das importierte Klarheitsmodul enthält standardmäßig alle clr-Symbole usw., und wir können auch andere Funktionen des Klarheitsmoduls verwenden.clr-header
Der gleiche Fehler tritt auch beiclr-icon
anderen auf. Wie ich in meinem vorherigen Kommentar erwähnt habe, enthält das Clarity-Modul diese standardmäßig. Ich hoffe es hat deine Frage beantwortet.Dieses Problem wurde in der Datei /app/app.module.ts behoben
Importieren Sie Ihre Komponente und deklarieren Sie sie
quelle
Haben Sie das Webpack verwendet ... wenn ja, bitte installieren
und setzen Sie es
quelle