angular - 如何判断 Angular2 模块是否可以导入共享模块

标签 angular

是否有用于确定模块是否为提供者或导出作为提供者的其他模块的试金石?用于确定模块是否是列在“共享”模块中的候选者?

来自 angular.io:

“出于前面解释的原因,SharedModule 不应该有提供者。它的任何导入或重新导出的模块也不应该有提供者。如果你偏离了这个准则,知道你在做什么以及为什么。”

https://angular.io/docs/ts/latest/cookbook/ngmodule-faq.html#!#q-module-recommendations

但是,如果我要使用一个模块,比如说 ReactiveFormsModule 或 RoutingModule,我如何确定它是否通过了上述测试?如果我只是在 SharedModule 中使用没有提供程序的模块或重新导出提供程序的导入模块,那么肯定有某种方法可以判断模块是否满足此要求。这是什么?

最佳答案

服务通常旨在成为具有应用程序范围的单例。

当一个模块被导入时,导入模块提供的服务被添加到宿主模块的注入(inject)器中。通过在共享模块中提供服务,存在多个模块导入共享模块并创建服务的多个副本的真正危险,每个副本都具有模块范围。确保如果您将服务添加到 SharedModule,这就是您想要的。

根据最佳实践,每个应用程序都应该有一组核心模块。这些核心模块不是共享的(它应该只由 AppModule 导入)所以在不破坏单例意图的情况下将服务添加到核心模块是安全的。

试金石:

If you want Singleton Services that are shared application-wide, then don't put them in a SharedModule because SharedModules could be imported from multiple modules within the same application. Instead put them in CoreModules, which should only be imported by the AppModule.

记住以下约定和准则:

  1. 每个应用程序只有一个 AppModule
  2. AppModules 可以导入其他模块
  3. 核心模块只能由 AppModule 导入
  4. 共享模块可以被任何模块导入(不仅仅是 AppModule)

关于angular - 如何判断 Angular2 模块是否可以导入共享模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42877813/

相关文章:

javascript - Angular 2 下载 Zip 格式文件

ng 构建后, Angular cli 重复 block 名称

javascript - 组件上的 Angular 单击事件将内部元素作为目标发送

ionic-framework - (Ionic 2) 滑动幻灯片时保持幻灯片自动播放

Angular Routes 不渲染子组件,而是渲染父组件

angular - ngrx/data 实体数据服务

ios - 为什么 `mediaCapture.captureImage()` 会使我的 `ionic` 应用程序崩溃?

typescript - Angular2 导入路径在运行时错误

javascript - 在 Angular 中更改 CSS 主题

css - 如何通过输入文本的模型将照片设置为背景图像