在NgModule中使用forRoot的目的是什么?

Man*_*gam 34 angular-ngmodel angular

在NgModule中使用forRoot的目的是什么?

它与AngularJS 1.x中的提供程序相同吗?

它如何在延迟加载中发挥重要作用?

TIA.

JBo*_*hUA 31

它与单身人士有关.角度服务被加载到页面上1次(单例),所有引用都指向此1个实例.

存在一个延迟加载的模块将尝试创建应该是单例的第二个实例的风险,并且forRoot()方法是一种确保应用程序模块/共享模块/和任何延迟加载的模块都使用相同的1个实例(根实例).

更多信息复制自: 在Angular 2中提供核心单一服务模块

最好的方法是使用提供程序创建模块.请记住,如果您的服务位于共享模块中,您可能会获得多个实例.最好的办法是使用Module.forRoot配置模块.

按照惯例,forRoot静态方法同时提供和配置服务.它需要一个服务配置对象并返回一个ModuleWithProviders.

仅在根应用程序模块AppModule中调用.在任何其他模块中调用它,特别是在延迟加载的模块中,与意图相反,并且可能产生运行时错误.

记得导入结果; 不要将它添加到任何其他@NgModule列表.

编辑 - 在评论中对于CODY的问题发现了关于角度文档的更多信息..

如果模块同时提供提供者和声明(组件,指令,管道),然后将其加载到子注入器(如路由)中,则会复制提供者实例.提供者的重复会引起问题,因为它们会影响根实例,这可能是单例.出于这个原因,Angular提供了一种将提供者从模块中分离出来的方法,以便可以将相同的模块导入到根模块中,其中提供者和子模块没有提供者.

在模块上为Root()(按惯例)创建静态方法.将提供程序放入forRoot方法,如下所示.为了使其更具体,请以RouterModule为例.RouterModule需要提供Router服务以及RouterOutlet指令.必须由根应用程序模块导入RouterModule,以便应用程序具有路由器,并且应用程序至少具有一个RouterOutlet.它也必须由各个路由组件导入,以便它们可以将RouterOutlet指令放入其子路径的模板中.

如果RouterModule没有forRoot(),然后每个路由组件将实例化一个新的路由器的实例,这将打破应用程序只能有一个路由器.出于这个原因,RouterModule有RouterOutlet声明,以便它可以无处不在,但路由器供应商只是在forRoot().结果是根应用程序模块导入RouterModule.forRoot(...)并获取路由器,而所有路由组件导入不包含路由器的RouterModule.

如果您有一个提供提供程序和声明的模块,请使用此模式将它们分开.

  • 我在文档中找到了我的问题的答案:_答案基于Angular依赖注入系统的基本特征.注入器可以添加提供程序,直到它首次使用.一旦注入器开始创建和提供服务,其提供者列表就会被冻结; 不允许新的提供者._ (2认同)

Sha*_*vek 9

ForRoot()

forRoot()当我们想要在加载同一模块的多个实例的应用程序中维护单个服务实例(单例)时使用。它还可用于发送一些配置参数,这些配置参数是在XYZ使用一个中央实例加载模块 () 时所需的,然后XYZ在其他子模块中使用。例如:路由器模块

举个例子,看一下这个演示代码,其中计数器对于急切加载模块和延迟加载模块的行为不同。

该计数器由CounterService位于 下的维护SharedModule。由于延迟加载的模块创建了自己的服务实例,因此我们失去了singletonAngular 服务的行为。

为了解决这个问题,我们需要引入 的概念forRoot()可以在这个演示中看到工作示例。这也是同样的原因,我们使用它来RouterModule帮助RouterService理解多个模块的应用程序行为。

RouterModule.forRoot(ROUTES)

如果您想要一个关于如何以及在何处实现它的真实示例,那么本文一定会对您有所帮助


Saj*_*ran 5

来自 docs

forRoot 创建一个包含所有指令、给定路由和路由器服务本身的模块。

您可以阅读更多关于为什么使用它的信息 here


Sae*_*far 5

创建路由模块有两种方法:

\n\n
RouterModule.forRoot(routes)\n
Run Code Online (Sandbox Code Playgroud)\n\n

创建一个路由模块,其中包括路由器指令、路由配置和路由器服务

\n\n
RouterModule.forChild(routes)\n
Run Code Online (Sandbox Code Playgroud)\n\n

创建一个路由模块,其中包含路由器指令、路由配置,但不包含路由器服务。当您的应用程序具有多个路由模块时,需要 RouterModule.forChild() 方法。

\n\n
\n

请记住,路由器服务负责我们的应用程序状态和浏览器 URL 之间的同步。实例化与同一浏览器 URL 交互的多个路由器服务会导致问题,因此无论有多少路由,我们的应用程序中都必须只有一个路由器服务实例,这一点至关重要我们在应用程序中导入模块。

\n\n

当我们导入使用 RouterModule.forRoot() 创建的路由模块时,Angular 将实例化路由器服务。当我们导入使用 RouterModule.forChild() 创建的路由模块时, Angular 不会实例化路由器服务。

\n\n

因此,对于其他路由模块,我们只能使用 RouterModule.forRoot() 一次,并多次使用 RouterModule.forChild() 。

\n
\n