在ngmodule中使用forroot的目的



在ngmodule中使用froot的目的是什么?

它与Angularjs 1.x?

中的提供商相同

它如何在懒惰加载中起重要作用?

tia。

与单例有关。Angular Service已加载到第1页(Singleton)的第1页,所有参考都将重新指向此1个实例。

有一个懒惰的模块会尝试创建一个应该是单身顿的第二个实例,而foroot()方法是确保应用程序模块/共享模块/和任何懒惰的模块的一种方法所有人使用相同的1个实例(root实例)。

更多信息从:在Angular 2

中提供核心单例服务模块

最好的方法是使用提供商创建模块。请记住,如果您的服务在共享模块中,则可能会获得多个实例。最好的想法是用模块配置模块。

按照惯例,Forroot静态方法同时提供和配置服务。它采用服务配置对象并返回ModulewithProviders。

仅在root应用程序模块AppModule中调用Forroot。在任何其他模块中,尤其是在懒惰的模块中调用它,这与意图相反,并且可能会产生运行时错误。

记住导入结果;不要将其添加到任何其他@ngmodule列表中。

编辑 - 关于Cody的问题,在评论中找到了有关Angular Docs的更多信息。

如果模块提供提供商和声明(组件,指令,管道),然后将其加载到子注射器(例如路由)中,则将复制提供者实例。提供者的重复将引起问题,因为它们会掩盖根本实例,这可能是单身人士。因此,Angular提供了一种将提供商从模块中分离出来的方法,因此可以使用提供商和儿童模块将相同的模块导入根模块。

在模块上创建一个静态方法()(通过惯例)。如下所示,将提供商放置在Forroot方法中。为了使其更具体,请以鲁atemodule为例。Routermodule需要提供路由器服务以及Routeroutlet指令。Routermodule必须由root Application模块导入,以便应用程序具有路由器,并且该应用程序至少具有一个Routeroutlet。它也必须由单个路由组件导入,以便它们可以将Routeroutlet指令放入其模板中以进行子路由。

如果Routermotule没有Forroot(),则每个路由组件将实例化新路由器实例,该实例将破坏应用程序,因为只能有一个路由器。因此,Routermodule具有Routeroutlet声明,以便在任何地方可用,但是路由器提供商仅在Forroot()中。结果是root Application模块导入Routermot.forroot(...)并获取路由器,而所有路由组件导入Routermodule不包括路由器。

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

forroot()

当我们要在整个应用程序上维护单个实例(Singleton)服务时,使用

forRoot()。它也可以用来发送一些与一个中心实例加载模块(XYZ)时需要的配置参数,然后在其他子模块中使用XYZ。例如:Routermodule

举一个例子,请查看此演示代码,其中计数器对渴望和懒惰的负载模块的行为不同。

该计数器由驻留在SharedModule下的CounterService维护。由于,懒惰的负载模块创建了自己的服务实例,因此我们将失去Angular Services的singleton行为。

要解决此问题,我们需要介绍forRoot()的概念。在此演示中可以看到工作示例。这是同样的原因,我们将其与RouterModule一起使用来帮助RouterService了解使用多个模块的应用程序行为。

routermotule.forroot(路由)

如果您想要一个真实世界的实施示例,那么本文肯定会帮助您

docs

FROOT创建一个包含所有指令的模块 路线和路由器服务本身。

您可以阅读更多有关为什么使用 here

使用的信息

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

RouterModule.forRoot(routes)

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

RouterModule.forChild(routes)

创建一个路由模块包括路由器指令,路由配置,但不是路由器服务。当您的 应用程序有多个路由模块。

请记住,路由器服务会照顾 我们的应用状态和浏览器URL。实例化倍数 与同一浏览器URL交互的路由器服务将导致 问题,因此必须只有一个实例 无论我们的应用程序中的路由器服务,无论多次路由模块 我们在应用程序中导入。

当我们导入使用使用的路由模块时 Routermot.forroot(),Angular将实例化路由器服务。 当我们导入使用的路由模块时 Routermodule.forchild(),Angular不会实例化路由器 服务。

因此,我们只能使用routermotule.forroot()一次并使用 Routermodule.forchild()多次用于其他路由模块。

forroot()将用于注入应用程序顶部的提供商。组件和指令的实例每次都被创建一个新实例。当您在应用程序的根部提及相同(使用forroot())时,只会创建一个实例。

首先,我们需要了解提供者注入了一些差异,而不是注入组件和指令。当一类用@Injectable注释时,将在呼叫时创建此类的一个实例,并在整个应用程序中共享。为此,当在NGMODULE中导入类时,我们必须添加此(Forroot())方法。

希望您现在很清楚。

forroot静态方法是配置应用程序的根路由模块的方法。当您调用Routermot.forroot(路由)时,您正在要求Angular在全球范围内实例化路由器类的实例。就像Angular创建一个新的基本AppModule来导入所有功能模块一样,它也提供了批准模块以导入所有子路由。

在您通过Angular CLI创建的新应用程序中,实际上已经在App-Routing.module.ts内部使用了Forroot方法。在您的应用程序中,您只想一次使用forroot方法。这是因为此方法告诉Angular可以实例化引擎盖下的路由器类实例,并且您的应用中只能有一个路由器。FROOT静态方法是确保您正在使用Singleton类的模式的一部分。

有关此的更多信息,请查看阅读更多

当模块"急切"时,请使用forroot - 负载(应用程序启动时加载)。Angular为所有模块创建了一个工厂,除了懒惰模块(按需加载时)具有自己的工厂。当我们使用forroot()时,我们正在加载一个将要注入模块的"根"的提供商,因为它使用了与我们的主模块相同的工厂。

简单的术语,forroot的使用使我们可以从没有懒惰的应用程序中的任何点访问提供商。

最新更新