2017-04-01 51 views
2

我学习angular2的延迟加载和共享依赖使用this制品。我明白,懒惰模块有一个单独的依赖关系树,它不与eager模块共享相同的服务实例。角2懒惰模块和共享的模块单

当我从懒惰模块的进口部分中删除SharedModule进口,行为改变,我急切和懒惰模块之间的单独服务。

作为每文档中为了重新使用相同的共享服务有更多的如本文this描述来完成。但是我可以通过从共享模块定义中删除导入来使其工作。有人可以解释这种现象

这里是plnkr

@NgModule({ 
    imports: [ 
    //SharedModule //This is removed 
    routing 
    ], 
    declarations: [LazyComponent] 
}) 
+0

我可以解释你。列出所有问题 – Aravind

+0

我的问题是为什么它工作,即使我没有按照其他文章的步骤。即我没有导入共享模块作为.forRoot() – Sridhar

回答

6

延迟加载不创建一个单独依赖关系树 - 至少,不是在你所描述的方式。

正如你可能知道,角的依赖注入系统实际上是注射器的一棵树 - 一个视图层次结构中的每个组件。当你请求一个依赖项时,Angular走这个注入器树,从请求依赖项的组件开始,直到找到能够提供依赖项的第一个注入器。 如果你需要它,这给你很大的力量,因为在组件树的任何级别上,你都可以指定一个提供者来依赖组件,并让那个组件获得它自己的依赖实例。此外,该组件的任何子项也将共享相同的依赖实例。

那的层次依赖注入相对于组件的基本工作大纲。但是,对于模块来说,情况有点不同。默认情况下,NgModule提供的任何依赖项都会添加到根注入器中,这意味着该依赖项的单个实例将被整个应用程序共享。这是一个例外,如果NgModule延迟加载。在这种情况下,惰性加载模块提供的依赖关系不会被添加到根注入器。相反,这些依赖关系将被添加到延迟加载模块的根组件中(我很难学会这一点 - 如果你的懒惰加载模块有多个“根组件”,每个“根组件”都会得到它自己的实例依赖)。

因此,它仍然是相同的基本层次 - 它只是渴望已加载的模块及其依赖添加到根注射器,而懒加载的模块他们添加到他们的模块的根组件。另外,如果延迟加载的模块导入一个也提供依赖关系的NgModule(例如您的SharedModule),那些依赖关系也将被添加到该模块的根组件。 (请注意,如果SharedModule也是急切加载的,它的依赖关系也将被添加到根注入器 - 导致这些依赖关系的多个实例可用)。

最后一点就是您看到您所看到的行为的原因。当您的懒惰模块导入SharedModule时,SharedModules提供的依赖项会被添加到惰性模块的根组件 - 导致这些依赖项的重复实例。

+0

很好的答案。顺便说一下,从实际的角度来看,值得注意的是,如果服务总是被任意加载的'ngModule加载,那么没有理由将其导入延迟加载的服务中。另一方面,如果你将状态置于服务之外,那么这个问题根本不会影响你。 –

+1

@AluanHaddad关于保持服务状态的非常好的观点。我的意思是,有时候这是不可避免的 - 您将服务用作两个不同组件之间的状态共享机制 - 但这更多的是例外情况 – snorkpete