为什么从 Material2 中删除了 forRoot()?对于延迟加载的功能模块我能做些什么?

why was forRoot() removed from Material2 and what can I do about in regards to lazy loaded feature modules?

我有一个项目使用 material2 ("@angular/material": "^2.0.0-beta.6")

根据文档 here 指出 MaterialModule 正在被删除并且 forRoot() 已经被压缩。我知道将模块分开以确保适当的 tree shaking 背后的思考过程,但为什么还要删除子模块中的 forRoot?

考虑这个用例

两个模块依赖于相同的 material 子模块,如 OverlayModule。 注意: 这个 material 模块有它自己的供应商。

我应该如何构建我的新 AppSpecificMaterialModule,以便我也可以提供所有 material 的提供者并防止提供者 Singletons 重复?我是否必须注意 material 我的应用程序最终会使用并在 appModule 级别自行提供的特定提供程序?有点像所描述的 ?

forRoot() 方法已被删除,因为 Angular Material 团队找到了一个新的解决方案来确保给定的提供者是单例。

在创建 Material 中的提供者之前,有一个提供者工厂检查是否已经存在给定提供者的实例。

如果工厂找到祖先提供者,它会使用现有的提供者。如果没有类似的提供者实例化,它只会创建一个新实例。

官方提案已提交至 Angular 存储库:https://github.com/angular/angular/issues/13854

这是 link 到 Angular Material 的一个示例提供者工厂: https://github.com/angular/material2/blame/master/src/lib/core/a11y/live-announcer.ts#L86-L94

基本上,以下行尝试将任何其他现有 LiveAnnouncer 提供程序实例(跳过自身)注入工厂

[new Optional(), new SkipSelf(), LiveAnnouncer]

工厂函数然后获取任何现有的 LiveAnnouncer 实例作为工厂中的 DI 参数,如果存在实例,则仅 returns 现有实例。

否则它只会创建一个 new LiveAnnouncer(XXX) 实例。

export function xxxFactory(parentAnnouncer: LiveAnnouncer) {
  return parentAnnouner || new LiveAnnouncer(XXX); 
}

如何构建项目

回答你的问题。基本上你应该能够再次使用不同的组件模块(不关心根和子)