Angular2 RC5强制一个将组件导入移动到NgModule声明 - 为什么?

Web*_*urk 9 angular

看起来import您之前在组件中声明的任何声明都是在声明中声明的directives,pipes而现在的providers部分声明必须移到声明中.@Component()@ngModule

为什么是这样?

我理解这是为了减少组件中的样板,但这只适用于在应用程序中多次重用的声明.

对于仅在一个组件中使用的指令,组件,管道或提供程序,它似乎非常不必要,并且会导致@ngModules文件严重膨胀.

在下面的链接中,在最后的步骤5中,它指出:

对于RC5,您可以将组件,指令和管道保留在@Component元数据的指令和管道属性中.实际上,我们会自动将它们提升(添加)到它们所属的NgModule.

此选项对于向后兼容性是临时的.它将在Angular 2.0的最终版本中删除.

领先游戏并开始尽快将组件指令和管道移动到模块声明中.我们打算在下一个RC中删除所有已弃用的类,方法和属性.

资料来源:RC4至RC5迁移

Mel*_*igy 11

更新2

当我与NgModule自己做更多工作时,我发现对此的真正答案是文档称为特征模块.

这是一个想法,对于具有声明等的应用程序的子区域,您应该将每个区域放入子模块,AKA功能模块.

因此,具有仅在其中使用的指令而未在应用程序范围内使用的组件将不会变成组件+模块,其中模块与声明和提供程序有关,而组件只是正常组件工作.

我不确定我是否喜欢装饰器,但我非常喜欢它的供应商.现在,如果遇到这些问题,在调试服务生命周期问题时,很容易知道在哪里寻找服务提供者.

还有一件事我还不确定我是否喜欢,是功能模块不继承父模块的模块导入.这意味着您必须导入BrowserModule,HttpModuleFormsModule在每个功能模块中.我理解为什么(自成一体),但我讨厌冗长.

也就是说,您可以将所有常见导入包装到共享模块中,现在只有一件事可以导入到功能模块中.这是所建议的使用模式NG2-翻译例如,看这里后,"如果你有多个NgModules".

更新1

回答这个问题的设计文档的特定部分是标题为Deprecation的部分(以及为什么在其中的子部分.这是该部分直接链接.

原始答案

我们的想法是AoT(Ahead of Time)编译器可以获取一个模块并一次性编译其所有依赖项.它也是在同一个模块中,您不必重复地在组件上下文中重新定义它们.

此外,路由器然后能够使用模块作为延迟加载的边界,因为它可以延迟加载模块,知道模块声明包含其所有依赖项.

如果你阅读公告设计文件,你会更好地理解这个想法.