在导入服务时,我应该将它们导入"导入" NgModule中的数组或提供者数组?

时间:2017-12-17 00:55:27

标签: angular

来自Angular Doc,关于"进口"在NgModule中是:

  

指定模块列表,其导出的指令/管道应该可用于此模块中的模板。

和#34;提供商":

  

定义此模块的进样器中可用的可注入对象集。

所以这就是问题,当我想使用第三个模块中包含的第三个服务时,我应该在" import"中导入模块,还是在" provider&中注册特定服务#34;

3 个答案:

答案 0 :(得分:1)

通常,添加到任何模块的providers数组的所有服务都是应用程序范围的单例 - 这意味着它们会自动添加到根注入器中。无需将它们显式添加到AppModule的providers数组中。

这意味着当您导入已填充provider数组的模块(或其他模块导入模块)时,它们提供的服务可以注入任何可注入的构造函数 - 无论它在何处。只需导入服务,然后将其添加到可注入的构造函数中。

现在,我说"一般来说"因为在大多数情况下这是真的。唯一不同的情况是模块是延迟加载的模块(即加载延迟加载的路由)。延迟加载的模块有自己的根范围。如果你把它视为例外,那一切都是有道理的。

所以回答你的问题:

  1. 首选tns:AuthenticationToken是否有这样的方法。这将返回一个带有服务的模块,该模块将通过根注入器进行自举。

    module.forRoot()
  2. 如果没有" forRoot"方法,然后只需将模块导入AppModule。可能,该模块具有旨在向根注入器注册的服务。

    @NgModule({
        // forRoot ensures that services are added to root injector
        imports: [ThirdPartyModule.forRoot()],
        exports: [],
        declarations: [...],
        providers: [],
    })
    export class AppModule{ }
    
  3. 如果您需要从FeatureModule(或SharedModule)导入模块,因为您想利用其中包含的组件,指令和管道,您应该使用@NgModule({ imports: [ThirdPartyModule], exports: [], declarations: [...], providers: [], }) export class AppModule{ } 方法(如果有)之一。

    forChild()
  4. 如果模块的作者没有提供@NgModule({ // does not include any services. You still need to import // .forRoot() in the AppModule imports: [ThirdPartyModule.forChild()], exports: [], declarations: [...], providers: [], }) export class FeatureModule { } forRoot()方法,那么它可能永远不会被AppModule以外的任何模块导入。

  5. 模块的作者可能决定在模块中包含服务,但默认情况下选择不将其添加到providers数组中。在这种情况下,由您决定将其添加到模块的提供者数组(服务将具有根范围),或将其添加到组件的提供者数组(服务将具有组件范围)。

答案 1 :(得分:0)

  

当我想使用第3个模块中包含的第3个服务时,我应该在“进口”中导入模块,还是在“提供者”中注册特定服务?

您可以导入提供服务的模块。

答案 2 :(得分:0)

创建共享/核心模块,并在该模块的providers数组中包含所有常用模块,并在需要的地方导入该模块。
否则,最好只包括服务而不是整个模块。它只是用例。

from matplotlib import pyplot as plt

def onclick(event):
    if event.dblclick:
        fig, ax = plt.subplots()
        circle = plt.Circle((event.xdata,event.ydata),2.5,color='black')
        ax.set_xlim([-40, 40])
        ax.set_ylim([-40, 40])
        ax.set_aspect('equal')
        ax.add_artist(circle)
        plt.show()

cid = fig.canvas.mpl_connect('button_press_event',onclick)
  

并在导入数组内的根模块中使用此核心模块。