2017-10-17 106 views
2

加载两次当我最近读了Angular2的doc,它说是这样的:会在模块中延迟加载模块

如果我导入同一模块的两倍?

这不是一个问题。当三个模块全部导入模块'A'时,Angular 对模块'A'进行一次评估,第一次遇到它时,再次不这样做。

这在任何A级中的导入模块层次结构出现是真的。 >当模块'B'导入模块'A'时,模块'C'导入'B',模块'D'导入[C,B,A],然后'D'触发'C'的评估,触发'B'的评估,评估'A'。 当Angular在'D'中获得'B'和'A'时,它们已经被缓存并准备好去

角不喜欢与循环引用模块,所以不要让模块“A” ......

但我假定上述在所有预先加载模块的上下文中说明。我怀疑这是否适用于Lazy-load模块,例如,如果AppModule和延迟加载功能模块都导入同一模块(例如ModuleA),ModuleA是否会加载两次?

我想的是:ModuleA类型的两个模块实例将被创建时的AppModule和延迟加载模块的加载。我的理解是否正确?有人可以帮我澄清一下吗?先谢谢你。

回答

1

根据实验我做了,当我导入同一模块中的延迟加载的模块,装载的是延迟加载的时候,我可以看到共享模块的构造被再次调用。所以这回答我的问题,答案是肯定的。如果有人有不同的意见,请指出。

1

目前还不清楚你的意思是“加载”。

Angular不从服务器加载两次。在随后的使用中,它从缓存中使用它。

如果你的意思是否多个实例在内存中创建,然后是。

懒加载的模块创建依赖注入新的子范围。 如果一个模块被延迟加载的另一个模块加载,那么DI范围的层次结构就没有意义了。

RootScope (AppModule) 
    / \ 
    LazyA LazyB 
    /  \ 
    LazyC  LazyC 

如果存在的LazyC只有一个实例,这将需要LazyALazyB供应商提供给LazyC。 如果LazyB永远不会被加载?然后添加提供者将是没有意义的。

角度在创建范围后也无法更新提供者。这就是延迟加载模块引入新的子范围的原因。他们的提供者不会被添加到RootScope,因为它是所有非惰性加载模块的情况。因此创建一个新的实例是唯一的方法。

在我看来,这并不会造成伤害。 除了DI范围外,我不知道这将如何改变。

相关问题