Я пытаюсь использовать компонент, который я создал внутри AppModule, в других модулях. Однако я получаю следующую ошибку:
"Не перехвачено (в обещании): Ошибка: ошибки синтаксического анализа шаблона:
"contacts-box" не является известным элементом:
- Если 'contacts-box' является компонентом Angular, убедитесь, что он является частью этого модуля.
- Если «contacts-box» является веб-компонентом, добавьте «CUSTOM_ELEMENTS_SCHEMA» в «@ NgModule.schemas» этого компонента, чтобы подавить это сообщение.
Структура моего проекта довольно проста:
Я храню свои страницы в каталоге страниц, где каждая страница хранится в отдельном модуле (например, в модуле клиентов), и каждый модуль имеет несколько компонентов (например, компонент списка клиентов, компонент добавления клиентов и т. Д.). Я хочу использовать свой ContactBoxComponent внутри этих компонентов (например, внутри компонента-клиента).
Как видите, я создал компонент поля контактов внутри каталога виджетов, поэтому он в основном находится внутри AppModule. Я добавил импорт ContactBoxComponent в app.module.ts и поместил его в список объявлений AppModule. Это не сработало, поэтому я погуглил свою проблему и добавил ContactBoxComponent в список экспорта. Не помогло. Я также попытался поместить ContactBoxComponent в CustomersAddComponent, а затем в другой (из другого модуля), но у меня возникла ошибка, говорящая, что есть несколько объявлений.
Что мне не хватает?
Ответы:
Это 5 шагов, которые я выполняю, когда получаю такую ошибку.
Вы не можете объявить компонент дважды. Вы должны объявить и экспортировать свой компонент в новый отдельный модуль. Затем вы должны импортировать этот новый модуль в каждый модуль, который хотите использовать в своем компоненте.
Трудно сказать, когда следует создавать новый модуль, а когда нет. Обычно я создаю новый модуль для каждого повторно используемого компонента. Когда у меня есть компоненты, которые я использую почти везде, я помещаю их в один модуль. Когда у меня есть компонент, который я не использую повторно, я не буду создавать отдельный модуль, пока он мне не понадобится в другом месте.
Хотя может возникнуть соблазн собрать все компоненты в одном модуле, это плохо для производительности. При разработке модуль должен перекомпилироваться каждый раз, когда вносятся изменения. Чем больше модуль (больше компонентов), тем больше времени потребуется. Внесение небольших изменений в большой модуль занимает больше времени, чем внесение небольших изменений в небольшой модуль.
источник
У меня была аналогичная проблема. Оказалось, что
ng generate component
(с использованием CLI версии 7.1.4) объявление дочернего компонента добавляется в AppModule, но не в модуль TestBed, который его эмулирует.Пример приложения «Тур по героям» содержит
HeroesComponent
селектор withapp-heroes
. Приложение побежал хорошо , когда служил, ноng test
произвел это сообщение об ошибке:'app-heroes' is not a known element
. ДобавлениеHeroesComponent
вручную к объявлениям inconfigureTestingModule
(inapp.component.spec.ts
) устраняет эту ошибку.источник
У меня была точно такая же проблема. Прежде чем пробовать некоторые из решений, опубликованных здесь, вы можете проверить, действительно ли компонент не работает. Для меня ошибка была показана в моей IDE (WebStorm), но оказалось, что код работал отлично, когда я запускал его в браузере.
После того, как я выключил терминал (на котором работала ng serve) и перезапустил свою IDE, сообщение перестало появляться.
источник
У меня такая же проблема шириной php storm версии 2017.3. Это исправить для меня: форум поддержки intellij
Это была ошибка ширины @angular language service: https://www.npmjs.com/package/@angular/language-service
источник
В моем случае в моем приложении было несколько уровней модулей, поэтому модуль, который я пытался импортировать, нужно было добавить в родительский модуль, который его фактически использовал
pages.module.ts
, а неapp.module.ts
.источник
У меня такая же проблема, и это происходило из-за того, что другой функциональный модуль включил этот компонент по ошибке. При удалении из другой функции все заработало!
источник
В моем случае проблема заключалась в отсутствии объявления компонента в модуле, но даже после добавления объявления ошибка сохранялась. Мне пришлось остановить сервер и перестроить весь проект в VS Code, чтобы ошибка исчезла.
источник
Эта запутанная структура сводит меня с ума. Учитывая, что вы определили настраиваемый компонент в шаблоне другой компонентной части ТОГО же модуля, вам не нужно использовать экспорт в модуле (например, app.module.ts). Вам просто нужно указать объявление в директиве @NgModule вышеупомянутого модуля:
Вам НЕ нужно импортировать
JsonInputComponent
(в этом примере) вAppComponent
(в этом примере), чтобы использоватьJsonInputComponent
пользовательский компонент вAppComponent
шаблоне. Вам просто нужно добавить к настраиваемому компоненту префикс с именем модуля, для которого были определены оба компонента (например, приложение):Обратите внимание на app-json-input, а не json-input!
Демо здесь: https://github.com/lovefamilychildrenhappiness/AngularCustomComponentValidation
источник
Я начинаю Angular, и в моем случае проблема заключалась в том, что я не сохранил файл после добавления оператора импорта.
источник
Модули маршрутов (не видел в этом ответа)
Сначала проверьте: если вы объявили и экспортировали компонент внутри своего модуля, импортировали модуль, в котором хотите его использовать, и правильно назвали компонент внутри HTML.
В противном случае вы можете пропустить модуль внутри вашего модуля маршрутизации:
если у вас есть модуль маршрутизации с маршрутом, который направляется к компоненту из другого модуля, важно, чтобы вы импортировали этот модуль в этот модуль маршрута. В противном случае Угловая CLI покажет ошибку:
component is not a known element
.Например
1) Имея следующую структуру проекта:
2) Внутри у
todos-routing.module.ts
вас есть маршрут кedit.todo.component.ts
(без импорта его модуля):Маршрут будет работать нормально! Однако при импорте
sidebar.module.ts
внутриedit-todo.module.ts
вы получите сообщение об ошибке:app-sidebar is not a known element
.Исправление: поскольку вы добавили маршрут
edit-todo.component.ts
в шаг 2, вам нужно будет добавить егоedit-todo.module.ts
как импорт, после чего импортированный компонент боковой панели будет работать!источник
Я столкнулся с той же проблемой. В моем случае я забыл объявить родительский компонент в app.module.ts
В качестве примера, если вы используете
<app-datapicker>
селектор вToDayComponent
шаблоне, вы должны объявить обаToDayComponent
иDatepickerComponent
в app.module.tsисточник
Предположительно у вас есть компонент:
продакт-list.component.ts:
И вы получите такую ошибку:
app.component.ts:
Убедитесь, что вы импортируете компонент:
источник
Этот вопрос может показаться старым и странным, но когда я пытался загрузить модуль (ленивая загрузка) и получал ту же ошибку, я понял, что мне не хватает условия экспорта для компонента, который поставляется как часть более крупного модуля.
Эта ссылка на Angular.io объясняет, почему : Компоненты / службы внутри модуля по умолчанию остаются закрытыми (или защищенными). Чтобы сделать их общедоступными, их нужно экспортировать.
Расширяя ответ @Robin Djikof с образцом кода @ live-love , это то, чего технически не хватало в моем случае (Angular 8):
источник