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

时间:2016-08-18 07:00:50

标签: angular

您之前在组件中声明的任何import声明似乎都在directives的{​​{1}},pipesproviders部分声明了strong>必须移至@Component()声明。

为什么会这样?

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

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

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

  

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

     

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

     

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

来源RC4 to RC5 migration

2 个答案:

答案 0 :(得分:11)

更新2

当我自己更多地与NgModule合作时,我发现对此的真正答案是文档调用Feature Modules

这是为了对于具有声明等的应用程序的子区域,您应该将每个区域放入子模块,即AKA特征模块。

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

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

我还不确定我是否喜欢,是功能模块不会从父模块继承模块导入。这意味着您必须在每个功能模块中导入BrowserModuleHttpModuleFormsModule。我明白为什么(自足),但我讨厌冗长。

也就是说,您可以将所有常见导入包装到共享模块中,现在只有一件事可以导入到您的功能模块中。这是ng2-translate建议的使用模式,例如,在&#34之后查看here;如果你有多个NgModules"。

更新1

回答这个问题的设计文档的特定部分是标题为弃用的部分(以及为什么的子部分。这里' sa {{3 }}

原始答案

这个想法是AoT(Ahead of Time)编译器可以接受一个模块并一次性编译它的所有依赖项。同样在同一模块中,您不必重复在组件上下文中重新定义它们。

然后路由器也可以使用模块作为延迟加载的边界,因为它可以延迟加载一个模块,知道模块声明包含所有依赖项。

如果您阅读direct link to that sectionannouncement,我们会更好地理解这个想法。

答案 1 :(得分:2)

据我所知,它是垃圾。

他们的理由是模块提供了“延迟加载依赖的边界”?如果不表达依赖关系,那么当前的Component指令列表是什么?

如果你问我,NgModule是一个结构性变化,就是这样。它提供了逻辑分组组件的功能。是的,必须重新声明每个组件的依赖关系是令人讨厌的,但现在还有另一个问题 - 如果你有一个包含多个组件的模块,每个组件都有不同的依赖关系,那么所有这些依赖关系现在必须在模块级别声明,并且然后在每次使用模块中的任何一个组件时加载。这里最大的失败是,如果你明确地希望延迟加载一个组件或两个组件,你最终必须为每个逻辑分组创建一个模块声明,这是一个真正的灾难。

对我来说,像NgModule一样帮助Angular的作者构建Angular,同时搞砸实际使用Angular制作网站的人。 :P