javascript - Angular 2 和 ngmodule 注入(inject)器

标签 javascript angular

NGmodule 提供了一种在模块中组织代码的方法。

它还建议提供一些服务作为模块的属性,我不明白它的工作方式。

首先,这是否意味着如果我在 NG 模块的 provides 属性中添加服务,它将公开该服务(意味着我必须在内部调用该模块另一个使用它的服务)?

那么,是否存在 NGmodule 注入(inject)器级别?

如何在另一个模块中使用模块框外的服务?

最佳答案

在模块中提供服务意味着该服务将被实例化并提供给作为模块一部分的所有组件、指令和管道。 “实例化”一词在这里很关键——因为服务是单例的,所以模块必须跟踪使用它们的每个组件、指令或管道的服务。您也可以在单独的组件中提供服务,但这会在每个组件中分别实例化服务,从而有效地否定了我们最初使用单例服务的原因。在模块级别提供它可以为我们解决这个问题。

如果您想让您的服务在您的模块之外可用,则无需执行任何操作。在项目中导入的模块中提供服务意味着它在项目中的任何地方都可用。

相关:Why is a service provided in a feature module available everywhere?

如果您想让组件、指令或管道在您的模块之外可用,那么您必须导出它们(并将它们导入到您要使用它们的模块中)。您可以通过在模块中使用 export 关键字来做到这一点。

相关:What classes should I export?

例如,您可以使用 NgIf 指令,因为它是从 CommonModule ( docs ) 导出的,然后我们将其导入到我们自己的模块中:

@NgModule({
  declarations: [COMMON_DIRECTIVES, COMMON_PIPES],
  exports: [COMMON_DIRECTIVES, COMMON_PIPES],
  providers: [
    {provide: NgLocalization, useClass: NgLocaleLocalization},
  ],
})

有趣的事实:如果您只有一个模块(引导的根模块),那么您实际上只会使用 BrowserModule 而不是 CommonModule。 CommonModule 的所有功能都在 BrowserModule 中的原因是因为 BrowserModule 只是导入并重新导出整个 CommonModule。

module system 有一个很好的深入指南如果您想了解更多信息,请访问 angular2 的网站。我之前链接的常见问题页面也非常有用。

关于javascript - Angular 2 和 ngmodule 注入(inject)器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39601581/

相关文章:

javascript - 警报未出现在本地主机中

javascript - ExtJS Grid,填充输入字段时允许空格键

javascript - 当文档大小改变时调整 iframe 的大小

javascript - 从给定 URL 获取数据时正确映射到接口(interface)

angular - 不在 ngrx/effects 中调度 Action 时陷入无限循环

javascript - 我如何将 Node.js 实现到 Ionic/Angular 应用程序中?

javascript - 将图像上传到 SAP OData 服务时出现问题 - Put 方法

javascript - 为什么 Angular 2 的模板无法从 Angular 区域之外的调用进行更新?

angular - ng-lightning 与 angular2+systemjs 和 NgModule

angular - 强制 Angular 遵循 json 中的接口(interface)类型