Jeśli '<selector>' jest komponentem Angular, sprawdź, czy jest częścią tego modułu

132

Jestem nowy w Angular2. Próbowałem utworzyć komponent, ale pokazał błąd.

To jest app.component.tsplik.

import { Component } from '@angular/core';
import { MyComponentComponent } from './my-component.component';

@Component({
  selector: 'my-app',
  template: `
    <h1>Hello {{name}}</h1>
    <h4>Something</h4>
    <my-component></my-component>
  `,
  directives: [MyComponentComponent]
})
export class AppComponent { name = 'Sam' }

To jest komponent, który chcę stworzyć.

import { Component } from '@angular/core';

@Component({
selector: 'my-component',
template: `
    <p>This is my article</p>
`
})

export class MyComponentComponent {

}

Pokazywanie dwóch błędów:

  1. Jeśli my-componentjest to komponent kątowy, sprawdź, czy jest częścią tego modułu.
  2. Jeśli my-componentjest składnikiem sieci Web, dodaj CUSTOM_ELEMENTS_SCHEMAdo @NgModule.schemastego składnika, aby pominąć ten komunikat.

Proszę pomóż.

Vimal
źródło

Odpowiedzi:

152

Twoje MyComponentComponentpowinno być MyComponentModule.

W środku MyComponentModulenależy umieścić MyComponentComponentwewnątrz „eksport”.

Coś takiego, zobacz kod poniżej.

@NgModule({
   imports: [],
   exports: [MyComponentComponent],
   declarations: [MyComponentComponent],
   providers: [],
})

export class MyComponentModule {
}

i umieść w MyComponentModulein importsw app.module.tsten sposób (zobacz kod poniżej).

import { MyComponentModule } from 'your/file/path';

@NgModule({
   imports: [MyComponentModule]
   declarations: [AppComponent],
   providers: [],
   bootstrap: [AppComponent]
})

export class AppModule {}

Po wykonaniu tej czynności selektor komponentu będzie mógł zostać rozpoznany przez aplikację.

Możesz dowiedzieć się więcej na ten temat tutaj: https://angular-2-training-book.rangle.io/handout/modules/feature-modules.html

Twoje zdrowie!

Cyan Baltazar
źródło
10
jeśli nadal masz problemy, nie zapomnij sprawdzić swojego selektora zadeklarowanego w pliku .ts swojego komponentu. Być może zapomniałeś dodać „app-” do kodu HTML, gdy umieściłeś komponent w pliku html elementu nadrzędnego.
Jared
2
Wystąpił ten błąd spowodowany nieprawidłową nazwą @Input. Bardzo mylące, dlatego podczas rozwiązywania problemów usuń dane wejściowe w tagu komponentu.
Ben Racicot
Nadal mam z tym problemy. Importuję MatRadioModule z kątowego materiału / radia i dyrektywy w tym module generują ten błąd.
Souritra Das Gupta
1
To nie jest już ważne dla najnowszej wersji Angulara (testowałem go na wersji 8)
Dani,
22

Może to jest nazwa htmlkomponentu tagu

Używasz w htmlczymś takim<mycomponent></mycomponent>

Musisz tego użyć <app-mycomponent></app-mycomponent>

keivan kashani
źródło
9
Nazwa htmltagu określa selectorwłaściwość. W tym przypadku jest my-component.
Tomasz Jakub Rup
20

czy importujesz to w swoim app.module.tspodobnym i usuwasz dyrektywy bitowe: -

@NgModule({
    bootstrap: [AppComponent],
    imports: [MyComponentModule],// or whatever the name of the module is that declares your component.

    declarations: [AppComponent],
    providers: []
})
export class AppModule {}

Twój MyComponentModulepowinien wyglądać tak: -

@NgModule({
    imports: [],
    exports: [MyComponentComponent],
    declarations: [MyComponentComponent],
    providers: [],
})
export class MyComponentModule {
}
Joe Keene
źródło
2
Zapomniałeś oexports
Tomasz Jakub Rup
1
Pomogło mi to, ponieważ mogłem importować i eksportować komponent kątowy innej firmy. Dzięki
shubham arora
8

Sprawdź swój selektor w pliku nazwa_pliku.component.ts

Powiedziałbym, że używając tagu w różnych plikach html

<my-first-component></my-first-component>

Powinien być

<app-my-first-component></app-my-first-component>

Przykład

@Component({
  selector: 'app-my-first-component',
  templateUrl: './my-first-component.component.html',
  styleUrls: ['./my-first-component.component.scss']
})
grimur82
źródło
4

W moim przypadku pisałem testy jednostkowe dla komponentu, który używa podkomponentów, i pisałem testy, aby upewnić się, że te podkomponenty są w szablonie:

it('should include the interview selection subview', () => {
    expect(fixture.debugElement.query(By.css('app-interview')))
    .toBeTruthy()  
  }); 

Nie wyskoczył mi błąd, ale ostrzeżenie:

UWAGA: „wywiad w aplikacji” nie jest znanym elementem:

  1. Jeśli „rozmowa w aplikacji” jest składnikiem Angular, sprawdź, czy jest częścią tego modułu. UWAGA: „wywiad w aplikacji” nie jest znanym elementem:
  2. Jeśli „rozmowa w aplikacji” jest składnikiem Angular, sprawdź, czy jest częścią tego modułu.
  3. Jeśli „aplikacja-wywiad” jest komponentem sieciowym, dodaj „CUSTOM_ELEMENTS_SCHEMA” do „@ NgModule.schemas” tego komponentu, aby ukryć ten komunikat. ”

Ponadto podskładnik nie pojawił się w przeglądarce podczas testowania.

Kiedyś ng g c newcomponentgenerowałem wszystkie komponenty, więc były już zadeklarowane w module appmodule, ale nie w module testowym, który dla komponentu, który specyfikowałem.

beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ EditorComponent,
        InterviewComponent]
    })
    .compileComponents();
  }));
MDMoore313
źródło
1

Musisz zadeklarować swój MyComponentComponent w tym samym module swojego AppComponent.

import { AppComponent } from '...';
import { MyComponentComponent } from '...';

@NgModule({
   declarations: [ AppComponent, MyComponentComponent ],
   bootstrap: [ AppComponent ]
})
export class AppModule {}
J. Jerez
źródło
1
  1. Zadeklarować swój MyComponentComponentinMyComponentModule
  2. Dodaj swoją MyComponentComponentdo exportsatrybutu MyComponentModule

mycomponentModule.ts

@NgModule({
   imports: [],
   exports: [MyComponentComponent],
   declarations: [MyComponentComponent],
   providers: [],
})

export class MyComponentModule {
}
  1. Dodaj swój atrybut MyComponentModuledo swojego AppModuleimports

app.module.ts

    @NgModule({
       imports: [MyComponentModule]
       declarations: [AppComponent],
       providers: [],
       bootstrap: [AppComponent]
    })
    export class AppModule {} 

Ważne Jeśli nadal występuje ten błąd, zatrzymaj serwer ctrl+cz poziomu terminala i uruchom go ponownieng serve -o

katwekibs
źródło
Ostatnim krokiem jest to, czego potrzebowałem w projekcie, którego nie dotykałem od jakiegoś czasu. Po instalacji „npm install” „ng update”, a następnie „npm update”
Jeff Longo
1

W moim przypadku miałem komponent w module Shared.

Komponent ładował się i działał dobrze, ale maszynopis podświetlał tag HTML czerwoną linią i pokazywał ten komunikat o błędzie.

Wewnątrz tego komponentu zauważyłem, że nie zaimportowałem operatora rxjs.

import {map} from 'rxjs/operators';

Kiedy dodałem ten import, komunikat o błędzie zniknął.

Sprawdź wszystkie importy wewnątrz komponentu .

Mam nadzieję, że to komuś pomoże.

Dmitry Grinko
źródło
1

Sprawdź, w którym module jest deklarowany komponent nadrzędny ...

Jeśli komponent nadrzędny jest zdefiniowany w module współdzielonym, musi to być również moduł podrzędny.

Komponent nadrzędny może być zadeklarowany w module współdzielonym, a nie moduł, który jest logiczny w oparciu o strukturę / nazewnictwo plików, nawet interfejs wiersza poleceń Angular dodał go do niewłaściwego modułu w moim przypadku.

Robert Rendell
źródło
0

Mam nadzieję, że masz app.module.ts. W Twoim app.module.tsdodatku poniżej linii-

 exports: [myComponentComponent],

Lubię to:

import { NgModule, Renderer } from '@angular/core';
import { HeaderComponent } from './headerComponent/header.component';
import { HeaderMainComponent } from './component';
import { RouterModule } from '@angular/router';

@NgModule({
    declarations: [
        HeaderMainComponent,
        HeaderComponent
    ],
    imports: [
        RouterModule,
    ],
    providers: [],
    bootstrap: [HeaderMainComponent],
    exports: [HeaderComponent],
})
export class HeaderModule { }
Shubham Verma
źródło
0

W pliku components.module.ts zaimportuj IonicModule w następujący sposób:

import { IonicModule } from '@ionic/angular';

Następnie zaimportuj IonicModule w następujący sposób:

  imports: [
    CommonModule,
    IonicModule
  ],

więc twoje komponenty components.module.ts będą wyglądały tak:

import { CommonModule } from '@angular/common';
import {PostComponent} from './post/post.component'
import { IonicModule } from '@ionic/angular';

@NgModule({
  declarations: [PostComponent],
  imports: [
    CommonModule,
    IonicModule
  ],
  exports: [PostComponent]
})
export class ComponentsModule { }```
Riyad Khalifeh
źródło
0

Nie export **default** class MyComponentComponent!

Powiązana kwestia, która może znaleźć się pod tytułem, jeśli nie konkretne pytanie:

Przypadkowo zrobiłem ...

export default class MyComponentComponent {

... i to też schrzaniło sprawę.

Czemu? VS Code dodał import do mojego modułu, gdy umieściłem go w declarations, ale zamiast ...

import { MyComponentComponent } from '...';

miał

import MyComponentComponent from '...';

I to nie było mapowane w górę w dół, przypuszczalnie ponieważ nie było nigdzie nazwane „naprawdę” z domyślnym importem.

export class MyComponentComponent {

Nie default. Zysk.

ruffin
źródło