在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的使用使我们可以从没有懒惰的应用程序中的任何点访问提供商。