- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这两者之间有什么区别,各自的用例是什么?
docs不是很有帮助:
forRoot creates a module that contains all the directives, the givenroutes, and the router service itself.
forChild creates a module thatcontains all the directives and the given routes, but does not includethe router service.
我的模糊猜测是,一个用于“主”模块,另一个用于任何导入的模块(因为它们已经可以从主模块获得服务),但我真的想不出一个用例.
最佳答案
我强烈建议阅读这篇文章:
当你导入一个模块时,你通常使用对模块类的引用:
@NgModule({
providers: [AService]
})
export class A {}
-----------------------------------
@NgModule({
imports: [A]
})
export class B
通过这种方式,所有在模块 A
上注册的提供程序都将添加到根注入(inject)器中,并可用于整个应用程序。
但是还有另一种方法可以像这样向提供者注册模块:
@NgModule({
providers: [AService]
})
class A {}
export const moduleWithProviders = {
ngModule: A,
providers: [AService]
};
----------------------
@NgModule({
imports: [moduleWithProviders]
})
export class B
这与上一个具有相同的含义。
您可能知道延迟加载模块有自己的注入(inject)器。因此,假设您要注册 AService
以供整个应用程序使用,但某些 BService
仅可用于延迟加载的模块。您可以像这样重构您的模块:
@NgModule({
providers: [AService]
})
class A {}
export const moduleWithProvidersForRoot = {
ngModule: A,
providers: [AService]
};
export const moduleWithProvidersForChild = {
ngModule: A,
providers: [BService]
};
------------------------------------------
@NgModule({
imports: [moduleWithProvidersForRoot]
})
export class B
// lazy loaded module
@NgModule({
imports: [moduleWithProvidersForChild]
})
export class C
现在 BService
将仅可用于子延迟加载模块,而 AService
将可用于整个应用程序。
您可以像这样将上面的内容重写为导出模块:
@NgModule({
providers: [AService]
})
class A {
forRoot() {
return {
ngModule: A,
providers: [AService]
}
}
forChild() {
return {
ngModule: A,
providers: [BService]
}
}
}
--------------------------------------
@NgModule({
imports: [A.forRoot()]
})
export class B
// lazy loaded module
@NgModule({
imports: [A.forChild()]
})
export class C
###这与 RouterModule 有什么关系?假设它们都使用相同的 token 访问:
export const moduleWithProvidersForRoot = {
ngModule: A,
providers: [{provide: token, useClass: AService}]
};
export const moduleWithProvidersForChild = {
ngModule: A,
providers: [{provide: token, useClass: BService}]
};
当您从延迟加载模块请求 token
时,通过单独的配置,您将按计划获得 BService
。
RouterModule 使用 ROUTES
token 获取特定于模块的所有路由。由于它希望特定于延迟加载模块的路由在该模块内可用(类似于我们的 BService),因此它对延迟加载的子模块使用不同的配置:
static forChild(routes: Routes): ModuleWithProviders {
return {
ngModule: RouterModule,
providers: [{provide: ROUTES, multi: true, useValue: routes}]
};
}
关于angular - RouterModule.forRoot(ROUTES) 与 RouterModule.forChild(ROUTES),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40498081/
这两者之间有什么区别,各自的用例是什么? docs不是很有帮助: forRoot creates a module that contains all the directives, the give
在此stackblitz demo auth.routing.ts 模块导入 RouterModule 并使用它来配置 LoginComponent 的路由。然后它还再次导出 RouterModule
我的应用在生产环境中运行时遇到了问题。 我的应用使用来自@auth0/angular-jwt 的angular-jwt 如果用户拥有有效 token ,他将被转发到 MainScreenCompone
我正在尝试在我的 Angular 5 应用程序中实现延迟加载,但出现错误: 未捕获( promise ):错误:RouterModule.forRoot() 调用了两次。延迟加载的模块应该改用 Rou
我正在尝试在我的应用程序中实现延迟加载,但似乎遇到了一个问题,我收到了错误消息: Error: RouterModule.forRoot() called twice. Lazy loaded mod
我在学习Angular 2的 app-routing来自官方文档。我正在经历以下一段代码。 import { NgModule } from '@angular/core';
我有一个组件 ListComponent 需要在 2 个模块中使用,其中一个是延迟加载的。所以我创建了声明 ListComponent 的 SharedModule。 ListComponent 使用
我有一个组件 ListComponent 需要在 2 个模块中使用,其中一个是延迟加载的。所以我创建了声明 ListComponent 的 SharedModule。 ListComponent 使用
我正在学习 Angular2 教程:Tour of Heroes 我所有的教程旅程都如预期的那样,但是到了以下几点: https://angular.io/docs/ts/latest/tutoria
谁能告诉我component、loadChildren、redirectTo之间的区别? export const ROUTES: Routes = [{ path: '', redirectT
我是 Angular 的新手,目前从事路由方面的工作。我在组件中使用子路由时遇到问题。 routerLink 不会在组件中呈现为链接。如果我使用路由器 socket ,应用程序会崩溃。 使用路由器 s
我正在尝试使用创建一个包 Angular library starter 一切正常,直到我添加 RouterModule。 导致问题的模块 import { NgModule, ModuleWithP
scrollPositionRestoration :'top' 不适用于 RouterModule.forchild()? angular 7 中是否有任何解决方案可以确保页面在导航后始终滚动到顶部
请解释useHash: true角度2路线方法中的方法。 我的问题: 我们使用它的目的是什么。 为什么值是“真”为什么不是“假”? 如果值为假,会发生什么? RouterModule.forRoot(
在具有“useHash:true”路由器模块配置的Angular 7单页应用程序中,我需要生成要在新选项卡中打开的资源的url。 对于应用程序窗口中的路由,以下代码按预期工作: this.router
我正在我的 Angular 6 应用程序中实现延迟加载的功能模块,并已成功配置一个“发票”功能,但在为延迟加载的“费用”和“联系人”实现路由时遇到问题功能模块,其设置方式与第一个模块相同。 每个模块都
为什么 Angular RouterModule 使用 forRoot() 和 forChild()? 我已经阅读了有关 forRoot 模式以及如何保护提供者单例免受多重导入 (https://an
我几乎在每个组件模块上都有这两个导入: import { CommonModule } from '@angular/common'; import { RouterModule } from '@a
(前言:我来自 C#/WPF 背景,总体上是 Web 开发的新手 - 请多多包涵!) 使用 Angular 2,我可以这样定义我的路线: RouterModule.forChild([
假设我有以下 appRoutingModule: export const routes: Route[] = [ { path: '', component: Applicati
我是一名优秀的程序员,十分优秀!