Если '<selector>' - это компонент Angular, убедитесь, что он является частью этого модуля.


132

Я новичок в Angular2. Я пытался создать компонент, но показывал ошибку.

Это app.component.tsфайл.

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' }

Это компонент, который я хочу создать.

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

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

export class MyComponentComponent {

}

Показаны две ошибки:

  1. Если my-componentэто компонент Angular, убедитесь, что он является частью этого модуля.
  2. Если my-componentэто веб-компонент, добавьте CUSTOM_ELEMENTS_SCHEMAк @NgModule.schemasэтому компоненту, чтобы подавить это сообщение.

Пожалуйста помоги.

Ответы:


152

Ваш MyComponentComponentдолжен быть внутри MyComponentModule.

И MyComponentModuleвы должны поместить MyComponentComponentвнутрь «экспорт».

Примерно так, см. Код ниже.

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

export class MyComponentModule {
}

и поместить MyComponentModuleв importsв app.module.tsтак (см код ниже).

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

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

export class AppModule {}

После этого приложение сможет распознать селектор вашего компонента.

Вы можете узнать об этом подробнее здесь: https://angular-2-training-book.rangle.io/handout/modules/feature-modules.html

Ура!


10
если у вас все еще есть проблемы, не забудьте проверить свой селектор, объявленный в файле .ts вашего компонента. Возможно, вы забыли добавить «app-» в html-код, когда поместили свой компонент в родительский html-файл.
Джаред

2
У меня была эта ошибка, вызванная неправильным именем @Input. Очень вводит в заблуждение, поэтому удалите входные данные в теге компонента во время устранения неполадок.
Ben

У меня все еще возникают проблемы с этим. Я импортирую MatRadioModule из углового материала / радио, и директивы в этом модуле выдают эту ошибку.
Суритра Дас Гупта

1
Это больше не актуально для последней версии Angular (я тестировал ее на версии 8)
Дэни

22

Может быть, это для имени htmlкомпонента тега

Вы используете htmlчто-то вроде этого<mycomponent></mycomponent>

Вы должны использовать это <app-mycomponent></app-mycomponent>


9
Имя htmlтега определяет selectorсвойство. В этом случае есть my-component.
Tomasz Jakub Rup

20

вы импортируете это в свой app.module.ts подобном виде и удаляете бит директив: -

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

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

У вас MyComponentModuleдолжно быть так: -

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

2
Вы забыли оexports
Томаш Якуб Руп

1
Это помогло мне, так как я смог импортировать и экспортировать сторонний компонент angular. Спасибо
shubham arora

8

Проверьте свой селектор в своем имени файла.component.ts

Используя тег в различных html файлах, я бы сказал

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

Должно быть

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

пример

@Component({
  selector: 'app-my-first-component',
  templateUrl: './my-first-component.component.html',
  styleUrls: ['./my-first-component.component.scss']
})

4

В моем случае я писал модульные тесты для компонента, который использует подкомпоненты, и я писал тесты, чтобы убедиться, что эти подкомпоненты присутствуют в шаблоне:

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

Я получил не ошибку, а предупреждение:

ПРЕДУПРЕЖДЕНИЕ: '' приложение-интервью '' не является известным элементом:

  1. Если приложение-интервью является компонентом Angular, убедитесь, что он является частью этого модуля. ПРЕДУПРЕЖДЕНИЕ: '' приложение-интервью '' не является известным элементом:
  2. Если приложение-интервью является компонентом Angular, убедитесь, что он является частью этого модуля.
  3. Если «app-интервью» является веб-компонентом, добавьте «CUSTOM_ELEMENTS_SCHEMA» в «@ NgModule.schemas» этого компонента, чтобы подавить это сообщение.

Кроме того, подкомпонент не во время тестирования отображался в браузере.

Раньше я ng g c newcomponentгенерировал все компоненты, поэтому они уже были объявлены в модуле приложения, но не в тестовом модуле, который для компонента, который я указывал.

beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ EditorComponent,
        InterviewComponent]
    })
    .compileComponents();
  }));

1

Вы должны объявить свой MyComponentComponent в том же модуле вашего AppComponent.

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

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

1
  1. Объявите свою MyComponentComponentвMyComponentModule
  2. Добавьте ваш MyComponentComponentк exportsатрибуту MyComponentModule

mycomponentModule.ts

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

export class MyComponentModule {
}
  1. Добавьте свой MyComponentModuleв свой importsатрибут AppModule

app.module.ts

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

Важно. Если ошибка по-прежнему возникает, остановите сервер ctrl+cс терминала и запустите его снова.ng serve -o


Последний шаг - это то, что мне нужно для проекта, к которому я давно не прикасался. После "npm install" "ng update", а затем "npm update"
Джефф Лонго

1

В моем случае у меня был компонент в общем модуле.

Компонент загружался и работал хорошо, но машинописный текст выделял тег html красной линией и отображал это сообщение об ошибке.

Я заметил, что внутри этого компонента не импортировал оператор rxjs.

import {map} from 'rxjs/operators';

Когда я добавил этот импорт, сообщение об ошибке исчезло.

Проверить весь импорт внутри компонента .

Надеюсь, это кому-то поможет.


1

Проверить, в каком модуле объявляется родительский компонент ...

Если ваш родительский компонент определен в общем модуле, ваш дочерний модуль должен быть таким же.

Родительский компонент может быть объявлен в общем модуле, а не в модуле, который является логическим на основе структуры / именования файловых каталогов, даже в моем случае Angular CLI добавил его в неправильный модуль.


0

Надеюсь, что у вас есть app.module.ts. В вашей app.module.tsстроке добавления ниже -

 exports: [myComponentComponent],

Как это:

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 { }

0

В свой components.module.ts вы должны импортировать IonicModule следующим образом:

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

Затем импортируйте IonicModule следующим образом:

  imports: [
    CommonModule,
    IonicModule
  ],

так что ваш components.module.ts будет таким:

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 { }```

0

Не надо export **default** class MyComponentComponent!

Связанная проблема, которая может подпадать под заголовок, если не под конкретный вопрос:

Я случайно сделал ...

export default class MyComponentComponent {

... и это тоже напортачило.

Зачем? VS Code добавил импорт в мой модуль, когда я его вставил declarations, но вместо ...

import { MyComponentComponent } from '...';

это было

import MyComponentComponent from '...';

И это не отображалось в нисходящем направлении, предположительно, поскольку оно «на самом деле» нигде не было названо при импорте по умолчанию.

export class MyComponentComponent {

Нет default. Прибыль.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.