- 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/
我有一个 app-routing.module 和一个延迟加载的模块,它加载了 dashbord。 { path: '', redirectTo: '', pathMatch: 'full'}, {
当使用 loadChildren() 调用导入子路由时,我遇到了覆盖根路由的问题。 应用路由声明为: const routes: Routes = [ { path: '', redirectTo
我很惊讶没有问题的确切答案: forRoot/forChild 方法是用来做什么的? 例如在 RouterModule 中: Router.forRoot(routes) 最佳答案 RouterMod
Repo可在此处突出显示该问题。 我遇到了竞争条件问题。我创建了一个 ConfigModule - 它有一个 forRoot 和一个 forChild。 forRoot 设置加载 .env 文件,fo
我正在使用 ionic cli 使用此命令生成页面 ionic generate page login ionic g page login 然后我在浏览器中收到这个错误 Typescript Err
scrollPositionRestoration :'top' 不适用于 RouterModule.forchild()? angular 7 中是否有任何解决方案可以确保页面在导航后始终滚动到顶部
为什么 Angular RouterModule 使用 forRoot() 和 forChild()? 我已经阅读了有关 forRoot 模式以及如何保护提供者单例免受多重导入 (https://an
这两者之间有什么区别,各自的用例是什么? docs不是很有帮助: forRoot creates a module that contains all the directives, the give
我是一名优秀的程序员,十分优秀!