Общий сервис NgbModal

Я хочу иметь возможность отображать формы в модальном режиме или на странице. Мои формы на страницах довольно просты, потому что и страница, и форма существуют в одном и том же модуле. Однако для форм в модальных окнах все немного иначе.

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

showForm(component: any, options?:NgbModalOptions){
    const modal = this.ngbModal.open(content, {
      backdrop: 'static',
      size: 'lg',
     ...options
   });
   ...
}

Этот модальный сервис должен был находиться в моем SharedModule, который импортируется на уровне модуля приложения. Затем у меня есть безопасный модуль, который загружается лениво. В безопасном модуле у меня есть компонент PracticeFormComponent, который является формой, которую я хочу показать в своем модальном окне. У меня есть PracticeFormComponent в объявлениях, экспорте и entryComponents SecureModule.

Когда я пытаюсь вызвать modalService.showForm(PracticeFormComponent) со страницы, которая также объявлена ​​в SecureModule, я получаю сообщение об ошибке: «Фабрика компонентов не найдена». Я не уверен, что мне здесь не хватает.

Если кто-нибудь может помочь мне с этим, а также со вторым вопросом, можно ли вызвать FormComponent для загрузки из другого модуля, даже если он является лениво загруженным дочерним элементом или братом SecureModule?

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
342
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

I then have a secure module that is lazy loaded. In the secure module I have a PracticeFormComponent that is the form that I want to show in my modal.

Фабрика компонентов PracticeFormComponent не существует, пока не загружен ленивый модуль.

When I try to call modalService.showForm(PracticeFormComponent) from a page that is also declared in SecureModule

Вы используете класс компонента (функция конструктора) вместо фабрики компонентов. WebPack позволит вам импорт эту функцию прямо из файла TypeScript. Таким образом, не будет никаких ошибок времени компиляции, но во время выполнения модальные службы попытаются обнаружить фабрику компонентов по этой ссылке, и она будет использовать инжектор зависимостей, который использовался для создания этого сервера.

Вам нужно изменить функцию showForm(), чтобы она требовала фабрику компонентов вместо any, и использовать ее для создания модального окна.

Это затем поможет вам решить проблемы с зависимостями, связанные с модулем, потому что вы не сможете получить фабрику, если она не существует в DI.

Вы можете создавать модальные окна внутри ленивого модуля, но не снаружи. Если вам нужно сделать это вне ленивого модуля, то этот модальный компонент на самом деле не ленивый. Это общий компонент.

Другие вопросы по теме