Je viens de passer de Angular 2 rc4 à rc6 et j'ai des problèmes pour le faire.
Je vois l'erreur suivante sur ma console:
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
Voici mon composant d'en-tête:
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... }
Voici mon module d'en-tête:
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 { }
J'ai créé un module wrapper appelé module util qui importe le HeaderModule:
import { NgModule } from '@angular/core';
import {HeaderModule} from "./header/header.module";
// ...
@NgModule({
declarations: [ ],
bootstrap: [ ],
imports: [ HeaderModule]
})
export class UtilModule { }
Qui est finalement importé par l'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 { }
À ma connaissance, je suis les instructions du message d'erreur en utilisant le SCHEMA pour surmonter l'erreur. Mais cela ne semble pas fonctionner. Qu'est-ce que je fais mal? (J'espère que ce n'est rien d'évident que je ne vois pas pour le moment. J'ai passé les 6 dernières heures à passer à cette version ...)
angular
karma-jasmine
Raphael Hippe
la source
la source
AppModule
, devez-vous toujours l'ajouter à votre composant?Réponses:
Je voulais juste ajouter un peu plus à ce sujet.
Avec la nouvelle version finale angulaire 2.0.0 (14 septembre 2016), si vous utilisez des balises HTML personnalisées, il le signalera
Template parse errors
. Une balise personnalisée est une balise que vous utilisez dans votre code HTML qui ne fait pas partie de ces balises .Il semble que la ligne
schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
doit être ajoutée à chaque composant dans lequel vous utilisez des balises HTML personnalisées.EDIT: La
schemas
déclaration doit être chez un@NgModule
décorateur. L'exemple ci-dessous montre un module personnalisé avec un composant personnaliséCustomComponent
qui autorise n'importe quelle balise html dans le modèle html pour ce composant.custom.module.ts
custom.component.ts
custom.component.html
Ici, vous pouvez utiliser n'importe quelle balise HTML de votre choix.
la source
CUSTOM_ELEMENTS_SCHEMA
faux module de test unitaire. Dès que j'ai fait ça, il a cessé de se plaindre.CUSTOM_ELEMENTS_SCHEMA
pourrait conduire à des erreurs difficiles à trouver, mais j'aimerais utiliser des noms d'élément personnalisés pour lesng-content
sections de mes contrôles sans que ces noms d'élément spécifiques provoquent des erreurs et sans créer de composants pour eux qui ne seraient que ng-content ...schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
doit être ajoutée à chaque composant où vous utilisez des balises HTML ? Il semble que leComponent
décorateur n'accepte pas deschemas
paramètre.Component
décorateur, on le trouve dans leNgModule
décorateur. Vous devrez créer un module pour ce composant, puis vous pourrez y spécifier le schéma. Lien vers des documents et un exemple.Ceci est résolu par:
a) ajouter
schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
à chaque composant oub) ajouter
et
à votre module.
la source
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
Cela peut également se produire lors de l'exécution de tests unitaires si vous testez un composant avec des éléments personnalisés. Dans ce cas, custom_elements_schema doit être ajouté au testingModule qui est configuré au début du fichier .spec.ts pour ce composant. Voici un exemple de la façon dont la configuration de header.component.spec.ts commencerait:
la source
Ajoutez ce qui suit sous
@NgModule({})
dans 'app.module.ts':puis
Votre 'app.module.ts' devrait ressembler à ceci:
la source
Cela n'a pas fonctionné pour moi non plus. j'ai changé
pour
qui a été suggéré dans cet article: https://scotch.io/tutorials/angular-2-transclusion-using-ng-content
Maintenant ça marche.
la source
CUSTOM_ELEMENTS_SCHEMA
n'a pas aidé maisNO_ERRORS_SCHEMA
a fait l'affaire et toute l'imbrication d'éléments angulaires autonomes fonctionne maintenant comme un charmeTestBed
. L'élément fonctionnait bien mais le test échouait. Ajoutéschemas: [NO_ERRORS_SCHEMA]
, et tout va bien.util.component.ts
util.module.ts
LogoutComponent doit être exporté
dashboard.module.ts
import
AccountModule
dans le module où nous voulons utiliser<app-logout>
import {AccountModule} de 'util.module';dashboard.component.ts
Je ne suis pas obligé d'importer et d'utiliser
CUSTOM_ELEMENTS_SCHEMA
.cependant cela ne fonctionne pas lorsque dashboard.module est chargé paresseusement.
Lors de l'utilisation
CUSTOM_ELEMENTS_SCHEMA
en cas de chargement différé, l'erreur est supprimée mais le composant n'est pas ajouté à dom.la source
Avec les composants contenant du matériau angulaire, une erreur similaire s'est produite avec mes tests unitaires. Selon la réponse de @Dan Stirling-Talbert ci-dessus, ajouté ceci à mon fichier .spec de composant et l'erreur a été effacée de mes tests unitaires.
Ajoutez ensuite le schéma dans l'instruction beforeEach () générée:
Mon erreur Karma était la suivante: Si 'mat-panel-title' est un composant Web, ajoutez 'CUSTOM_ELEMENTS_SCHEMA' au '@ NgModule.schemas' de ce composant pour supprimer ce message.
la source
Il suffit de lire cet article et selon la documentation angulaire 2:
Donc, juste au cas où quelqu'un rencontre ce problème, une fois que vous avez ajouté CUSTOM_ELEMENTS_SCHEMA à votre NgModule, assurez-vous que tout nouvel élément personnalisé que vous utilisez a un «tiret» dans son nom, par exemple. ou etc.
la source
C'est un article assez long et il donne une explication plus détaillée du problème.
Le problème (dans mon cas) survient lorsque vous avez une projection de contenu multi-slot
Voir aussi projection de contenu pour plus d'informations.
Par exemple, si vous avez un composant qui ressemble à ceci:
fichier html:
fichier ts:
Et vous voulez l'utiliser comme:
Et puis vous obtenez des erreurs d'analyse de modèle qui ne sont pas un composant angulaire connu et en fait ce n'est pas le cas - il s'agit simplement d'une référence à un contenu ng dans votre composant:
Et puis la solution la plus simple consiste à ajouter
... à votre app.module.ts
Mais il existe une approche simple et propre à ce problème - au lieu d'utiliser
<my-component-header>
pour insérer du code HTML dans l'emplacement là-bas - vous pouvez utiliser un nom de classe pour cette tâche comme ceci:fichier html:
Et vous voulez l'utiliser comme:
Donc ... plus de composants qui n'existent pas donc il n'y a pas de problèmes là-dedans, pas d'erreurs, pas besoin de CUSTOM_ELEMENTS_SCHEMA dans app.module.ts
Donc, si vous étiez comme moi et que vous ne vouliez pas ajouter CUSTOM_ELEMENTS_SCHEMA au module - utiliser votre composant de cette façon ne génère pas d'erreurs et est plus clair.
Pour plus d'informations sur ce problème - https://github.com/angular/angular/issues/11251
Pour plus d'informations sur la projection de contenu angulaire - https://blog.angular-university.io/angular-ng-content/
Vous pouvez voir également https://scotch.io/tutorials/angular-2-transclusion-using-ng-content
la source
Je voudrais ajouter une information supplémentaire car la réponse acceptée ci-dessus n'a pas complètement corrigé mes erreurs.
Dans mon scénario, j'ai un composant parent, qui contient un composant enfant. Et ce composant enfant contient également un autre composant.
Ainsi, le fichier de spécification de mon composant parent doit avoir la déclaration du composant enfant, AINSI QUE LE COMPOSANT ENFANT DE L'ENFANT. Cela a finalement résolu le problème pour moi.
la source
Je pense que vous utilisez un module personnalisé. Vous pouvez essayer ce qui suit. Vous devez ajouter ce qui suit au fichier your-module.module.ts :
la source
Cela n'a pas fonctionné pour moi (en utilisant 2.0.0). Ce qui a fonctionné pour moi a été d'importer RouterTestingModule à la place.
J'ai résolu ce problème en important RouterTestingModule dans le fichier de spécifications.
la source
Pour moi, j'avais besoin de regarder:
1. If 'cl-header' is an Angular component, then verify that it is part of this module.
Cela signifie que votre composant n'est pas inclus dans le
app.module.ts
. Assurez-vous qu'il est importé puis inclus dans ladeclarations
section.la source
Je viens d'importer
ClarityModule
et cela a résolu tous les problèmes. Essaie!Incluez également le module dans les importations.
imports: [ ClarityModule ],
la source
CUSTOM_ELEMENTS_SCHEMA
, sur angular.io/api/core/CUSTOM_ELEMENTS_SCHEMA, nous verrons que CUSTOM_ELEMENTS_SCHEMA permet à NgModule de contenir des éléments non angulaires avec un tiret (-) {similaire à ce scénario}. Le module de clarté une fois importé inclut toutes les icônes clr, etc. par défaut et nous pouvons également utiliser d'autres fonctionnalités du module de clarté.clr-header
. La même erreur vient pourclr-icon
et d'autres. Comme je l'ai mentionné dans mon commentaire précédent, le module Clarity les contient par défaut. J'espère que cela a répondu à votre question.a résolu ce problème dans le fichier /app/app.module.ts
importez votre composant et déclarez-le
la source
Avez-vous utilisé le webpack ... si oui, veuillez installer
et le mettre
la source