Angular2 RC6: '<componente> no es un elemento conocido'

128

Recibo el siguiente error en la consola del navegador cuando intento ejecutar mi aplicación Angular 2 RC6:

> Error: Template parse errors: 'header-area' is not a known element:
> 1. If 'header-area' is an Angular component, then verify that it is part of this module.
> 2. If 'header-area' is a Web Component then add "CUSTOM_ELEMENTS_SCHEMA" to the '@NgModule.schema' of this component
> to suppress this message.("

    <div class="page-container">
        [ERROR->]<header-area></header-area>
        <div class="container-fluid">

> "): PlannerComponent@1:2

No entiendo por qué no se encuentra el componente. Mi PlannerModule se ve así:

@NgModule({
  declarations: [
    PlannerComponent,
    HeaderAreaComponent,
    NavbarAreaComponent,
    EreignisbarAreaComponent,
    GraphAreaComponent,
    nvD3
    ],
  imports: [
    RouterModule,
    CommonModule,
    ModalModule
    ],
  bootstrap: [PlannerComponent],
})
export class PlannerModule {}

y hasta donde entendí el concepto de Módulos en ng2, las partes de los módulos se declaran en 'declaraciones'. Para completar, aquí está el PlannerComponent:

@Component({
  selector: 'planner',
  providers: [CalculationService],
  templateUrl: './planner.component.html',
  styleUrls: ['./planner.component.styl']
})
export default class PlannerComponent {
}

y el Componente HeaderArea:

@Component({
  selector: 'header-area',
  templateUrl: './header-area.component.html',
  styleUrls: ['./header-area.component.styl']
})
export default class HeaderAreaComponent {
}

La <header-area>etiqueta se encuentra en planner.component.html:

<div class="page-container">
  <header-area></header-area>
  <div class="container-fluid">

    <div class="row">...

¿Me equivoqué?

Actualización : código completo

planner.module.ts:

import HeaderAreaComponent from '../header-area/header-area.component';
import NavbarAreaComponent from '../navbar-area/navbar-area.component';
import GraphAreaComponent from '../graph-area/graph-area.component';
import EreignisbarAreaComponent from '../ereignisbar-area/ereignisbar-area.component';
import PlannerComponent from './planner.component';
import {NgModule} from '@angular/core';
import {nvD3} from 'ng2-nvd3';
import {RouterModule} from '@angular/router';
import {CommonModule} from '@angular/common';
import {ModalModule} from 'ng2-bootstrap/ng2-bootstrap';

@NgModule({
  declarations: [
    PlannerComponent,
    HeaderAreaComponent,
    NavbarAreaComponent,
    EreignisbarAreaComponent,
    GraphAreaComponent,
    nvD3
  ],
  imports: [
    RouterModule,
    CommonModule,
    ModalModule
  ],
  bootstrap: [PlannerComponent],
})
export class PlannerModule {
  // TODO: get rid of the "unused class" warning
}

planner.component.ts

import {Component} from '@angular/core';
import CalculationService from '../_shared/services/calculation.service/calculation.service';
import HeaderAreaComponent from '../header-area/header-area.component';

@Component({
  selector: 'planner',
  providers: [CalculationService],
  templateUrl: './planner.component.html',
  styleUrls: ['./planner.component.styl']
})
export default class PlannerComponent {
}

planner.component.html

<div class="page-container">
  <header-area></header-area>
  <div class="container-fluid">

    <div class="row">
      <div class="col-xs-2 col-sm-1 sidebar">
        <navbar-area></navbar-area>
      </div>
      <div class="col-xs-10 col-sm-11">
        <graph-area></graph-area>
      </div>
    </div><!--/.row-->

    <div class="row">
      <div class="col-xs-10 col-sm-11 offset-sm-1">
        <ereignisbar-area></ereignisbar-area>
      </div>
    </div><!--/.row-->

  </div><!--/.container-->
</div><!--/.page-container-->
frot.io
fuente
1
¿Por qué importa HeaderAreaComponentsin {}y los demás con {}. ¿Puedes intentar importarlos de la misma manera? (¿quizás quitando el default?)
Günter Zöchbauer
Eliminé el predeterminado y lo importé sin él {}, pero obtengo el mismo resultado.
frot.io

Respuestas:

252

Recibí este error cuando importé el Módulo A al Módulo B, y luego intenté usar un componente del Módulo A en el Módulo B.

La solución es declarar ese componente en la exportsmatriz.

@NgModule({
  declarations: [
    MyComponent
  ],
  exports: [
    MyComponent
  ]
})
export class ModuleA {}
@NgModule({
  imports: [
    ModuleA
  ]
})
export class ModuleB {}
Stephen Paul
fuente
52
Y, naturalmente, la documentación de Angular sobre componentes ni siquiera menciona esto.
John
¡Me había estado rascando la cabeza por este día! ¡Muchas gracias!
EGC
34

Lo arreglé con la ayuda de la respuesta de Sanket y los comentarios.

Lo que no podía saber y no aparecía en el mensaje de error es: importé el PlannerComponent como una declaración @ NgModule.de en mi módulo de aplicación (= RootModule).

El error se solucionó importando el PlannerModule como @ NgModule.imports .

Antes de:

@NgModule({
  declarations: [
    AppComponent,
    PlannerComponent,
    ProfilAreaComponent,
    HeaderAreaComponent,
    NavbarAreaComponent,
    GraphAreaComponent,
    EreignisbarAreaComponent
  ],
  imports: [
    BrowserModule,
    RouterModule.forRoot(routeConfig),
    PlannerModule
  ],
  bootstrap: [AppComponent]
})
export class AppModule {

Después:

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    RouterModule.forRoot(routeConfig),
    PlannerModule
  ],
  bootstrap: [AppComponent]
})
export class AppModule {
}

Gracias por tu ayuda :)

frot.io
fuente
1
Edité su respuesta para cambiar el formato para hacer la diferencia más clara. Ahora que he hecho esto, veo que parece que la diferencia es que simplemente eliminaste una serie de elementos declarations. ¿Podría ser esto correcto?
Jason Swett
1
Jepp, eso es correcto. AppModule y PlannerModule son dos cosas separadas, y he declarado algunos componentes en ambas. Funciona declarando un componente en un solo módulo e importando este módulo dentro del otro.
frot.io
gracias por publicar su solución, pero en la sección "antes" también muestra como importado el PlannerModule
Juan Monsalve
23

Si ha utilizado la definición de componente generada automáticamente por Webclipse, puede encontrar que el nombre del selector tiene 'aplicación-' antepuesto. Aparentemente, esta es una nueva convención cuando se declaran subcomponentes de un componente principal de la aplicación. Compruebe cómo se ha definido su selector en su componente si ha usado 'nuevo' - 'componente' para crearlo en IDE angular. Entonces en lugar de poner

<header-area></header-area>

tu puedes necesitar

<app-header-area></app-header-area>
FayeB
fuente
1
Lo mismo es cierto con los componentes generados por ngcli también.
explorador
Si genero un componente con --selectoropción, entonces no necesito prefijar app-con la etiqueta del componente. Ej:ng generate component menu-list --selector 'menu-list'
explorador de
No puedo creer que este fuera mi problema ..: / ¡Gracias! ¡Votado!
Saxofonista
8

Busco el mismo problema para <flash-messages></flash-messages>angular 5.

Solo necesita agregar las siguientes líneas en el archivo app.module.ts

import { ---, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { FlashMessageModule } from "angular-flash-message";


@NgModule({
  ---------------
  imports: [
    FlashMessageModule,
    ------------------         
  ], 
  -----------------
  schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
  ------------
})

NB: estoy usando este para mensajes flash de mensajes

reza.cse08
fuente
La única solución para mi problema que enfrentaba desde hace 2 horas
Veronica
7

En su componente de planificador , debe faltar importar HeaderAreaComponent de esta manera:

import { HeaderAreaComponent } from '../header-area.component'; 
//change path according your project

Además, asegúrese de que todos los componentes y tuberías deben declararse a través de un NgModule .

A ver si esto ayuda.

Sanket
fuente
Desafortunadamente no, el error sigue siendo el mismo y la importación está marcada como no utilizada por pelusa.
frot.io
¿puede publicar el código completo de su componente NgModule y planificador?
Sanket
1
Además de Gunter sugerencia anterior, también tratar de importar BrowserModule en su planificador de CompoNet así-import { BrowserModule } from '@angular/platform-browser';
Sanket
Lo importé en el componente planificador y en el módulo declarándolo como importación, todavía no fue un éxito.
frot.io
1
ahora intente agregar CalculationService en proveedores de NgModule como este-providers: [CalculationService],
Sanket
6

Estaba enfrentando este problema en Angular 7 y el problema fue después de crear el módulo, no lo hice ng build. Así que realicé

  • ng build
  • ng serve

Y funcionó.

Shailesh Pratapwar
fuente
simplemente ejecutar ng servir de nuevo lo hizo por mí, aunque cojo
Elger Mensonides
4

El error viene en la prueba unitaria, cuando el componente está fuera de la <router-outlet>página principal de la aplicación. Por lo tanto, debe definir el componente en el archivo de prueba como a continuación.

<app-header></app-header>
<router-outlet></router-outlet>

y luego necesita agregar el archivo spec.ts como se muestra a continuación.

import { HeaderComponent } from './header/header.component';

describe('AppComponent', () => {
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [
        RouterTestingModule
      ],
      declarations: [
        App`enter code here`Component,
        HeaderComponent <------------------------
      ],
    }).compileComponents();
  }));
});
Farzad.Kamali
fuente
3

Otra posible causa de tener el mismo mensaje de error es una falta de coincidencia entre el nombre de la etiqueta y el nombre del selector. Para este caso:

<header-area></header-area>El nombre de la etiqueta debe coincidir exactamente con 'header-area'la declaración del componente:

@Component({
  selector: 'header-area',
Alexei
fuente
2

Tuve el mismo problema con angular RC.6 por alguna razón, no permite pasar componentes a otros componentes usando directivas como decorador de componentes para el componente principal

Pero si importa el componente secundario a través del módulo de la aplicación y lo agrega a la matriz de declaración, el error desaparece. No hay mucha explicación de por qué este es un problema con angular rc.6

Emmanuel Mariki
fuente
2

Cuando tuve este problema, fue porque usé 'templateUrl' en lugar de solo 'template' en el decorador, ya que uso webpack y necesito usar require en él. Solo tenga cuidado con el nombre del decorador, en mi caso generé el código repetitivo usando un fragmento, el decorador se creó como:

@Component({
  selector: '',
  templateUrl: 'PATH_TO_TEMPLATE'
})

pero para webpack el decorador debería ser simplemente ' template ' NO ' templateUrl ', así:

@Component({
  selector: '',
  template: require('PATH_TO_TEMPLATE')
})

cambiar esto resolvió el problema para mí.

¿Quieres saber más sobre los dos métodos? lea esta publicación mediana sobre templatevstemplateUrl

Leo Bottaro
fuente
2

Recibí este error cuando tenía un nombre de archivo y una clase que no se exportaba:

nombre de archivo: list.component.ts

clase exportada: ListStudentsComponent

Cambiar de ListStudentsComponent a ListComponent solucionó mi problema.

GonnaGetGet
fuente
2

Me encontré con este problema exacto. Falló: errores de análisis de plantilla: 'app-login' no es un elemento conocido ... con ng test. Intenté todas las respuestas anteriores: nada funcionó.

SOLUCIÓN DE PRUEBA NG:

Angular 2 Karma Test 'nombre-componente' no es un elemento conocido

<= Añadí declaraciones para los componentes ofensivos en beforEach(.. declarations[])a app.component.spec.ts .

EJEMPLO app.component.spec.ts

...
import { LoginComponent } from './login/login.component';
...
describe('AppComponent', () => {
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [
        ...
      ],
      declarations: [
        AppComponent,
        LoginComponent
      ],
    }).compileComponents();
  ...
paulsm4
fuente
2

Tuve el mismo problema y lo solucioné agregando el componente (MyComponentToUse) en la matriz de exportaciones en el módulo donde se declaró mi componente (ModuleLower). Luego importo ModuleLower en ModuleHigher, para poder reutilizar ahora mi componente (MyComponentToUse) en ModuleLower y ModuleHigher

            @NgModule({
              declarations: [
                MyComponentToUse
              ],
              exports: [
                MyComponentToUse
              ]
            })
            export class ModuleLower {}


            @NgModule({
              imports: [
                ModuleLower
              ]
            })
            export class ModuleHigher {} 
Ilyes CHERIF
fuente
Exactamente, solo necesito exportar componentes.
Rohit Parte
1

Tuve el mismo problema con Angular 7 cuando voy a refinar el módulo de prueba declarando el componente de prueba. Acabo de agregar schemas: [ CUSTOM_ELEMENTS_SCHEMA ]lo siguiente y se solucionó el error.

TestBed.configureTestingModule({
  imports: [ReactiveFormsModule, FormsModule],
  declarations: [AddNewRestaurantComponent],
  schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
});
Chamila Maddumage
fuente
1

Para futuros problemas. Si cree que siguió todas las buenas respuestas y, sin embargo, el problema está ahí.

Intenta apagar y encender el servidor.

Tuve el mismo problema, seguí todos los pasos, no pude resolverlo. Apague, encienda y se solucionó.

Lena Tevar
fuente
Primero pensé que solo tenía que reiniciar npm start(bajo el agua ng serve). Eso a veces ayuda a aclarar problemas. Ahora tenía que reiniciar Visual Studio Code por completo.
Mike de Klerk
0

Un error de novato estaba generando el mismo mensaje de error en mi caso.

La app-rootetiqueta no estaba presente en index.html

Felipe Andrade
fuente
0

OnInitse implementó automáticamente en mi clase al usar la ng new ...frase clave en CLI angular para generar el nuevo componente. Entonces, después de eliminar la implementación y eliminar el método vacío que se generó, el problema se resuelve.

Auguste
fuente
0

Para mí, la ruta para templateUrl no era correcta

Yo estaba usando

shopping-list-edit.component.html

Mientras que debería haber sido

./shopping-list-edit.component.html

Error tonto pero sucede al comenzar. Espero que ayude a alguien en apuros.

Meena Chaudhary
fuente
0

Respuesta tardía para el hilo, pero estoy seguro de que hay más personas que pueden usar esta información explicada desde otra perspectiva.

En Ionic, los componentes angulares personalizados se organizan en un módulo separado llamado ComponentsModule. Cuando se genera el primer componente usando ionic generate component, junto con el componente, iónico genera el ComponentsModule. Cualquier componente posterior se agrega al mismo módulo, con razón.

Aquí hay una muestra ComponentsModule

import { NgModule } from '@angular/core';
import { CustomAngularComponent } from './custom/custom-angular-component';
import { IonicModule } from 'ionic-angular';
@NgModule({
    declarations: [CustomAngularComponent],
    imports: [IonicModule],
    exports: [CustomAngularComponent],
    entryComponents:[

      ]
})
export class ComponentsModule {}

Para usar el ComponentsModuleen la aplicación, como cualquier otro módulo angular, ComponentsModulesdebe importarse al AppModule. El componente de generación iónica (v 4.12) no agrega este paso, por lo que debe agregarse manualmente.

Extracto de AppModule:

@NgModule({
  declarations: [
    //declaration
  ],
  imports: [
    //other modules 
    ComponentsModule,
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    //ionic pages
  ],
  providers: [
    StatusBar,
    SplashScreen,
    {provide: ErrorHandler, useClass: IonicErrorHandler},
    //other providers
  ]
})
export class AppModule {}
Aragorn
fuente
-1

Ok, déjenme dar los detalles del código, cómo usar el componente de otro módulo.

Por ejemplo, tengo el módulo M2, el módulo M2 tiene el componente comp23 y el componente comp2, ahora quiero usar comp23 y comp2 en app.module, así es como:

esto es app.module.ts, mira mi comentario,

 // import this module's ALL component, but not other module's component, only this module
  import { AppComponent } from './app.component';
  import { Comp1Component } from './comp1/comp1.component';

  // import all other module,
 import { SwModule } from './sw/sw.module';
 import { Sw1Module } from './sw1/sw1.module';
 import { M2Module } from './m2/m2.module';

   import { CustomerDashboardModule } from './customer-dashboard/customer-dashboard.module';


 @NgModule({

    // declare only this module's all component, not other module component.  

declarations: [
AppComponent,
Comp1Component,


 ],

 // imports all other module only.
imports: [
BrowserModule,
SwModule,
Sw1Module,
M2Module,
CustomerDashboardModule // add the feature module here
],
 providers: [],
 bootstrap: [AppComponent]
})
export class AppModule { }

Este es el módulo m2:

   import { NgModule } from '@angular/core';
   import { CommonModule } from '@angular/common';

   // must import this module's all component file
   import { Comp2Component } from './comp2/comp2.component';
   import { Comp23Component } from './comp23/comp23.component';

   @NgModule({

   // import all other module here.
     imports: [
       CommonModule
     ],

    // declare only this module's child component. 
     declarations: [Comp2Component, Comp23Component],

   // for other module to use these component, must exports
     exports: [Comp2Component, Comp23Component]
   })
   export class M2Module { }

Mi recomendación en el código explica lo que debe hacer aquí.

ahora en app.component.html, puedes usar

  <app-comp23></app-comp23>

siga el módulo de importación de muestras de documentación angular

hoogw
fuente