RouterModule.forRoot(ROUTES) 与 RouterModule.forChild(ROUTES)

2023-12-01

这两者之间有什么区别,各自的用例是什么?

The docs并不完全有帮助:

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

forChild 创建一个模块 包含所有指令和给定的路由,但不包括 路由器服务。

我模糊的猜测是,一个用于“主”模块,另一个用于任何导入的模块(因为它们已经可以从主模块获得该服务),但我真的想不出用例。


我强烈建议阅读这篇文章:

  • 避免 Angular 中模块的常见混淆

与提供商的模块

当您导入模块时,通常使用对模块类的引用:

@NgModule({
    providers: [AService]
})
export class A {}

-----------------------------------

@NgModule({
    imports: [A]
})
export class B

通过这种方式,所有提供者都在模块上注册A将被添加到根注入器并可用于整个应用程序。

但是还有另一种方法可以向提供者注册模块,如下所示:

@NgModule({
    providers: [AService]
})
class A {}

export const moduleWithProviders = {
    ngModule: A,
    providers: [AService]
};

----------------------

@NgModule({
    imports: [moduleWithProviders]
})
export class B

这与前一个具有相同的含义。

您可能知道延迟加载的模块有自己的注入器。所以假设你想注册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

Now 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 有什么关系? 假设它们都使用相同的令牌进行访问:

export const moduleWithProvidersForRoot = {
    ngModule: A,
    providers: [{provide: token, useClass: AService}]
};

export const moduleWithProvidersForChild = {
    ngModule: A,
    providers: [{provide: token, useClass: BService}]
};

根据您的要求提供单独的配置token从延迟加载的模块中你会得到BService正如计划。

Router模块使用ROUTES令牌来获取特定于模块的所有路由。由于它希望特定于延迟加载模块的路由在此模块内可用(类似于我们的 BService),因此它对延迟加载子模块使用不同的配置:

static forChild(routes: Routes): ModuleWithProviders {
    return {
        ngModule: RouterModule, 
        providers: [{provide: ROUTES, multi: true, useValue: routes}]
    };
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RouterModule.forRoot(ROUTES) 与 RouterModule.forChild(ROUTES) 的相关文章

  • 使用管道将文件夹从 Bitbucket 存储库推送到公共服务器

    我在 Bitbucket 存储库中启用了管道 并且需要在每次构建后在我的服务器中运行 Angular 2 构建并部署 dist 文件夹 在执行构建命令后创建 我的 bitbucket pipelines yml 文件中有以下内容 image
  • Angular RouteReuseStrategy 后退按钮/跨模块

    有关我的应用程序的信息 Angular 12 由 3 个模块组成 每个模块都有一个带有列表的概述页面和一些详细信息页面 每条路线都有一个区域标签 因此我知道用户正在哪个模块中导航 所以我想实现 Angular 的 RouteReuseStr
  • Angular4 Material md-table 列宽度像普通表一样自动调整大小

    我在 Angular 4 应用程序中使用 md table 因为我将 Material 用于 UI 格式的其他部分 当我使用基本上没有 CSS 的常规表格时 列会自动设置格式以适合最宽的 td 元素 使用 md table 除了太宽的单元格
  • 在 MatDialog Content Angular 7 中添加新行

    我正在使用 MatDialog 并尝试在内容定义中添加新行 两个都 n and 没有这样做 有没有另一种方法无需手动进入 html 并更改它 因为它是可重用的组件 var status MatDialogRef
  • Angular 5 - 谷歌未定义(谷歌地图)

    我想在我的 Angular 5 应用程序上使用谷歌地图 但遇到了一些问题 加载视图时 我在 js 控制台中收到错误 LoginComponent Host ngfactory js sm 1 ERROR ReferenceError goo
  • 加载带有数据的 PROMISE 后的 Angular 2 渲染模板

    我是 AngularJS 2 0 的新手 基本上我是通过构造函数中的 Promise 加载数据 但模板是在 Promise 解析之前渲染的 知道如何实现这一目标吗 谢谢 M 您可以测试data在使用它之前 ul li item value
  • Asp.net core webapi获取从Angular4应用程序发布的空值

    我是新来的Angular4在快速交付内容的情况下 所以没有时间彻底学习它 所以如果我的问题看起来很幼稚 请原谅 From my Asp Net Web API I have Confirmemail API必须从 Angular4 应用程序
  • Angular 中的单元测试点击事件

    我正在尝试将单元测试添加到我的 Angular 2 应用程序中 在我的一个组件中 有一个带有 click 处理程序 当用户单击按钮时 将调用在中定义的函数 ts类文件 该函数在 console log 窗口中打印一条消息 表明该按钮已被按下
  • 为什么使用 MarkForCheck() 和 setTimeout?

    我对 ChangeDetectorRef 中的 MarkForCheck 方法有疑问 对于一种用法我必须使用this cd markForCheck 因为在控制台中我获取了值 但它没有在视图上更新 setTimeout gt this ch
  • Angular 15 参考错误:初始化前无法访问“组件 A”

    我在相互导入独立组件时遇到一个问题 成分A Component standalone true selector app a templateUrl a component html styleUrls a scss imports BCo
  • Angular SlickGrid 对齐标题文本

    我正在使用角度SlickGrid并希望将列标题中的文本居中或右对齐 并非所有列都以相同的方式 我发现 有一个headerCssClass列定义中的属性 但我一直尝试 这种样式似乎从未被应用 对于列定义 id sourceNumber nam
  • Angular 4 Http POST 不起作用

    我希望每个人都做得很好 我最近开始使用 Angular 4 4 我一直在尝试将数据发布到我的 api 服务器 但不幸的是它不起作用 我花了大约两天的时间 但仍然没有成功 甚至已经尝试过 6 7 篇文章角 io https angular i
  • Angular2:动态同步http请求

    Goal 发出一系列同步 http 请求并能够将它们作为一个可观察流进行订阅 示例 不工作 let query arr test1 test2 test3 function make request query arr if query a
  • Angular 4 中的箭头函数(Lambda 函数)

    我对lambda知之甚少 lambda表达式被视为一个函数 我们有很多方法可以做到这一点 这是我的简单功能TypeScript file byPan card1 card2 return card1 pan card2 pan 我在 HTM
  • 有没有办法扩展 angular.json 中的配置?

    在构建 Angular 6 应用程序时 我需要同时指定两件事 如果是生产或开发版本 我正在使用的区域设置 In my angular json I have build configurations production fileRepla
  • Angular/ HTML5 到 iOS WKWebView 通信

    我们正在尝试看看发送信号的最佳选择是什么To iOS WKWebView fromAngular 6 HTML5 项目 任何示例都会很棒 我们想要做的是 我们在 Angular 网页上有一个按钮 单击该按钮应该通知 iOS 执行某些操作 我
  • 找不到本地“typescript”包。“@ngtools/webpack”包 Angular 2

    我在这里搜了一下 Angular 2 ngtools webpack AOT https stackoverflow com questions 42651383 angular 2 ngtools webpack aot 但对我不起作用
  • Angular 2发送数组另一页

    我正在使用 Angular 开发天气应用程序 我是 Angular 的新手 我想带上我选择的城市的天气信息 但我无法将数据发送到第二页 哪里有问题 预先感谢您的帮助 export class ForecastComponent implem
  • 具有多个 Angular 2 应用程序的 ASP.Net Core MVC [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试为一个我知道会变得越来越复杂的项目准备结构 我想使用 ASP Net Core MVC 进行顶层导航 我想在每个主视图中放置
  • Angular2 如何对自定义验证器指令进行单元测试?

    我为输入字段编写了一个非常简单的自定义验证器 import Directive from angular core import AbstractControl NG VALIDATORS from angular forms functi

随机推荐

  • 如何使用ajax在javascript中调用java类方法?

    我有一个java类 package MyPackage import java sql Connection import java sql DriverManager import java sql ResultSet import ja
  • Woocommerce 获取购物车项目元

    我的产品页面上有一个 自定义字段 我想将其添加到 Woocommerce 购物车页面中的产品标题上方 这是自定义字段数据 我用这个 PHP 代码让它在单个产品卡上工作 add action woocommerce after shop lo
  • 如何在 Windows 计算机上从命令提示符运行 PHP 程序?

    I m a PHP开发人员按职业 我正在使用一个联想 Ideapad 笔记本电脑运行于Windows 10 家庭单语言 64 位操作系统 我也安装了XAMPP 控制面板 v3 2 2在地点 C xampp 执行PHP程序 in a 网页浏览
  • 如何将操作应用到选定的多个 Outlook 项目?

    代码here仅适用于一件物品 如何修改它来运行DisplayItemMetadata 参见代码 对于每个选定的项目 更新 尝试执行以下操作 For Each individualItem In Application ActiveExplo
  • 如何在 Windows 上更新 winpython 中的 scipy?

    我已经安装了 winpython 我想将 scipy 更新到版本 0 14 我怎样才能做到这一点 我应该完全重新安装 winpython 吗 EDIT 如果我跑pip install upgrade scipy来自WinPython Com
  • 运行多个工作守护进程 SLURM

    我想在一台机器上运行多个工作守护进程 按照达米安弗朗索瓦的回答关于slurm 集群的最少计算机数量是多少可以办到 问题是目前我只能在一台机器上执行 1 个工作守护进程 例如 当我跑步时 sudo slurmd N linux1 cDvv s
  • 在 UML 中设置关联最终所有权:对于可视化范式(或其他 UML 工具)中生成的代码意味着什么?

    将关联端所有权从 关联 设置为 分类器 对生成的代码有何影响 换句话说 0 我从一个空图表开始 1 我创建A类和B类 2 我用关联A B连接A和B 3 A处的关联端被命名为a 4 B处的关联端命名为b 5 a 的关联端所有权设置为 B 类
  • 如何仅获取外键过滤器的最新记录

    我有一张这样的桌子 事件表 id status date order FK 1 Planned 05 02 2015 1 2 Delivered 04 02 2015 2 3 Packed 03 02 2015 3 4 Return 06
  • 如何衡量图像检测算法的成功率和准确率?

    有谁知道如何正确量化图像检测算法的成功 如何结合这两个误差源 因为一个来源是算法未能检测到的对象数量 另一个来源是算法错误识别为对象的误报数量 例如 如果图像中有 574 个物体 但算法只检测到其中 540 个 同时产生 113 个误报 那
  • 动态重命名方法

    我们可以在类定义时使用元类重命名类方法 这个问题是not关于那个 这更像是一个思想实验 所以请稍微幽默一下 假设我想编写两个这样使用的装饰器 class SomeClass object append A def some method s
  • NsdManager 发现在 Android 9 上不起作用

    我已经尝试了很长时间 让 NsdManager 发现功能在 Android 9 上运行 它可以在之前的任何 Android 版本上运行 没有任何问题 出于测试目的 我使用这个简单的代码片段 并且清单中存在 INTERNET 权限 var n
  • Python 回车符不起作用

    我有一个长时间运行的脚本 可以循环数据库中的行 我经常希望它打印已处理的行数 但不需要每次都创建新行 这基本上就是我所拥有的 import sys mystr rows complete r for i in range 0 100 if
  • 是否可以在没有任何Python库的情况下从xlsx文件中读取信息?

    我被迫问这个问题 我的导师给了我一个任务 用纯Python从文件中提取数据 有一些txt文件很简单 但有一个文件xlsx扩展名 我找不到任何可以用纯Python从中提取数据的地方 我已经搜索了3周多了 如果不可能 请告诉我 以便我可以自信地
  • 在图片框中显示图像数组?

    我对 Visual C 很陌生 我想在图片框中显示图像数组 这是我的代码 string list Directory GetFiles C pictures jpg Image images new Image 5 for int inde
  • 为文本框创建气球工具提示?

    如何在 SWT 中为文本框创建气球工具提示 这是一个修改后的 SWT 代码片段 展示了如何向 SWT 添加气球工具提示Text实例 下次请考虑更具体地询问 我现在不问 如果这就是您要找的东西 Tooltip example snippet
  • 如何请求 gzipped/压缩的 SOAP 响应?

    我使用 wsimport 工具创建了一个运行良好的肥皂客户端 现在我喜欢从服务器请求压缩响应 因为响应可能非常大 我不知道服务器是否能够发送压缩内容 据我所知 我必须在请求中添加类似 Accept Encoding gzip 的内容 我该如
  • Copy-Item 使用凭据将文件从本地复制到远程服务器

    我正在尝试将一些文件和文件夹从本地计算机复制到远程服务器 Copy Item copy test txt destination serverip c backups 但我收到错误 Copy Item Logon failure unkno
  • 使用 PHP 检查图像是否唯一的好方法是什么?

    使用 PHP 检查图像是否唯一的最佳方法是什么 假设我有一个大约 30 张图像 大约 500 500 像素 的目录 并且有人上传了另一张图片 有什么好方法来检查上传的图像是否不在该目录中 是否有某种方法可以创建可以轻松比较的图像哈希 然后
  • 如何使用 JavaScript 将所有 HTML 子元素移动到另一个父元素?

    Imagine div span Foo span b Bar b Hello World div div div 可以编写什么 JavaScript 来移动所有子节点 元素和文本节点 old parent to new parent没有
  • RouterModule.forRoot(ROUTES) 与 RouterModule.forChild(ROUTES)

    这两者之间有什么区别 各自的用例是什么 The docs并不完全有帮助 forRoot 创建一个包含所有指令的模块 给定的 路由 以及路由器服务本身 forChild 创建一个模块 包含所有指令和给定的路由 但不包括 路由器服务 我模糊的猜