来自Angular Doc,关于"进口"在NgModule中是:
指定模块列表,其导出的指令/管道应该可用于此模块中的模板。
和#34;提供商":
定义此模块的进样器中可用的可注入对象集。
所以这就是问题,当我想使用第三个模块中包含的第三个服务时,我应该在" import"中导入模块,还是在" provider&中注册特定服务#34;
答案 0 :(得分:1)
通常,添加到任何模块的providers数组的所有服务都是应用程序范围的单例 - 这意味着它们会自动添加到根注入器中。无需将它们显式添加到AppModule的providers数组中。
这意味着当您导入已填充provider数组的模块(或其他模块导入模块)时,它们提供的服务可以注入任何可注入的构造函数 - 无论它在何处。只需导入服务,然后将其添加到可注入的构造函数中。
现在,我说"一般来说"因为在大多数情况下这是真的。唯一不同的情况是模块是延迟加载的模块(即加载延迟加载的路由)。延迟加载的模块有自己的根范围。如果你把它视为例外,那一切都是有道理的。
所以回答你的问题:
首选tns:AuthenticationToken
是否有这样的方法。这将返回一个带有服务的模块,该模块将通过根注入器进行自举。
module.forRoot()
如果没有" forRoot"方法,然后只需将模块导入AppModule。可能,该模块具有旨在向根注入器注册的服务。
@NgModule({
// forRoot ensures that services are added to root injector
imports: [ThirdPartyModule.forRoot()],
exports: [],
declarations: [...],
providers: [],
})
export class AppModule{ }
如果您需要从FeatureModule(或SharedModule)导入模块,因为您想利用其中包含的组件,指令和管道,您应该使用@NgModule({
imports: [ThirdPartyModule],
exports: [],
declarations: [...],
providers: [],
})
export class AppModule{ }
方法(如果有)之一。
forChild()
如果模块的作者没有提供@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以外的任何模块导入。
模块的作者可能决定在模块中包含服务,但默认情况下选择不将其添加到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)
并在导入数组内的根模块中使用此核心模块。