【问题标题】:Angular 2 and ngmodule injectorAngular 2 和 ngmodule 注入器
【发布时间】:2016-09-24 04:24:44
【问题描述】:

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

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

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

那么,是否有 NGmodule 注入器级别?

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

【问题讨论】:

    标签: javascript angular


    【解决方案1】:

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

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

    相关: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。

    如果您想了解更多信息,可以在 angular2 的网站上找到对 module system 的深入了解。我之前链接的 FAQ 页面也非常有用。

    【讨论】:

      猜你喜欢
      • 2016-12-26
      • 1970-01-01
      • 2017-01-30
      • 2017-06-15
      • 2017-02-27
      • 2017-01-27
      • 2017-03-08
      • 1970-01-01
      • 2017-02-02
      相关资源
      最近更新 更多