我有使用material2的项目(" @ angular / material":" ^ 2.0.0-beta.6")
根据文档here说明正在删除MaterialModule并且 forRoot()已被压缩。我知道将模块拆开以确保正确的树摇动背后的思考过程,但为什么也要删除subModules中的forRoot?
考虑此用例
两个模块依赖于相同的材质子模块,如OverlayModule。 注意:此材料模块有自己的提供商。
我应该如何构建我的新AppSpecificMaterialModule,以便我还可以提供所有材料的提供者并防止提供者Singletons的重复?我是否必须注意我的应用最终会消耗的材料特定提供商,然后在appModule级别提供自己?有点像here所描述的那样?
答案 0 :(得分:2)
已删除forRoot()
方法,因为Angular Material团队找到了一个新的解决方案,以确保给定的提供者是单身人士。
在创建Material中的提供者之前,有一个提供者工厂检查是否已存在给定提供者的实例。
如果工厂找到了祖先提供者,它会使用现有的提供者。如果没有类似的提供程序已经实例化,它将只创建一个新实例。
已在Angular存储库上提交了一份官方提案:https://github.com/angular/angular/issues/13854
以下是Angular Material的一个示例提供程序工厂的链接: https://github.com/angular/material2/blame/master/src/lib/core/a11y/live-announcer.ts#L86-L94
基本上以下行尝试将任何其他现有的LiveAnnouncer
提供程序实例(跳过self)注入工厂
[new Optional(), new SkipSelf(), LiveAnnouncer]
然后,工厂函数将任何现有的LiveAnnouncer
实例作为工厂中的DI参数获取,只返回现有实例(如果存在)。
否则它只会创建一个new LiveAnnouncer(XXX)
实例。
export function xxxFactory(parentAnnouncer: LiveAnnouncer) {
return parentAnnouner || new LiveAnnouncer(XXX);
}
如何构建项目
回答你的问题。基本上你应该能够再次使用不同的组件模块(不关心root& child)