NgbModal通用服务

时间:2019-04-28 17:18:24

标签: angular ng-bootstrap

我希望能够以模式或页面形式显示表单。我在页面上的表单非常简单,因为页面和表单都存在于同一模块中。但是,对于模态形式的表单,情况有所不同。

我想创建一个通用服务,我可以调用该服务并将其传递给组件,以使该组件以模式显示。所以我的服务有这样的方法:

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

此模式服务将位于我的SharedModule中,该SharedModule是在appmodule级别导入的。然后,我有一个延迟加载的安全模块。在安全模块中,我有一个PracticeFormComponent,它是我想在模式中显示的表单。我在SecureModule的声明,导出和entryComponents中具有PracticeFormComponent。

当我尝试从也在SecureModule中声明的页面调用modalService.showForm(PracticeFormComponent)时,出现错误消息,提示未找到组件工厂。我不确定我在这里缺少什么。

如果有人可以帮助我,还有第二个问题,即使它是惰性加载的子级或SecureModule的同级组件,也可以调用FormComponent从另一个模块加载吗?

1 个答案:

答案 0 :(得分:0)

  

然后我有一个延迟加载的安全模块。在安全模块中,我有一个PracticeFormComponent,它是我想在模式中显示的表单。

在加载惰性模块之前,PracticeFormComponent组件工厂不存在。

  

当我尝试从也在SecureModule中声明的页面调用modalService.showForm(PracticeFormComponent)

您正在使用组件类(构造函数)而不是组件工厂。 WebPack允许您直接从TypeScript文件导入此功能。因此不会有任何编译时错误,但是在运行时,模态服务将尝试从此引用中发现组件工厂,并且将使用用于创建该服务器的依赖项注入器。

您需要更改showForm()函数,以便它需要一个组件工厂而不是any,然后使用它来创建模态。

这将帮助您解决模块相关的依赖性问题,因为除非DI中存在工厂,否则您将无法获得工厂。

您可以从惰性模块内部创建模态,但不能从其外部创建模态。如果您需要在惰性模块之外执行此操作,那么该模式组件并不是真正的惰性。这是一个共享的组件。