当前位置: 首页 > Web前端 > HTML5

从AngularComponent和Directive的实例化说起AngularforRoot方法的命令由来

时间:2023-04-05 17:43:55 HTML5

区别于Angular服务的单例特性,Angular的组件和指令通常会被实例化多次,比如每次Component出现在HTML标记选择器,它会触发Component的实例化。这些组件和指令的范围仅限于导入它们的NgModule,以防止两个组件可能具有相同选择器的命名冲突。正是由于Angular的依赖注入(DI)行为的这种差异,有必要将包含组件和指令的NgModule与包含组件、指令和提供者的ModuleWithProviders区分开来,这就是forRoot()方法的用武之地。但是,依赖注射并不总是那么简单。有时在引导期间,应用程序的所有NgModule都不可用。延迟加载就是这样的一个例子。当一个NgModule在路由期间延迟加载时,提供者、提供者及其在延迟加载的NgModule中注册的子模块在引导期间不可用,此时Angular无法注册它们。因此,它们仅在路由加载时作为提供者添加,并且它们被限定为从延迟加载的NgModule及其子模块开始注入。如果有多个延迟加载的NgModule试图注册同一个提供者,则NgModule树的每个节点最终都会有一个不同的实例。通过在根目录中导入提供者,有助于确保所有延迟加载的NgModule都获得相同的提供者实例,这就是forRoot()以这种方式命名的原因。作为消费者,当应用层使用的库依赖需要一个惰性加载的NgModule时,需要调用它的forRoot方法。通过在应用程序的根目录导入模块并使用forRoot()方法注册它,可以全局导入提供程序。在其他NgModule中,当需要导入组件和指令时,使用适当的非根导入形式。