【问题标题】:Why all Directives and Pipes must be in module's declarations?为什么所有指令和管道都必须在模块的声明中?
【发布时间】:2018-01-28 14:00:48
【问题描述】:

任何指令和管道都必须在模块的声明中。为什么不能将它们添加到组件级别,而必须始终处于模块级别?为什么 Angular 团队放了这个限制?

【问题讨论】:

  • 在模块存在之前它们处于组件级别,相信我,在每个组件中一遍又一遍地重复指令和管道是非常痛苦的。它只是避免了很多重复。
  • 我同意。但是,如果管道或指令只能由模块中的一个组件使用,而不能由同一模块中的其他组件使用,则无法限制。

标签: angular angular2-directives angular2-pipe


【解决方案1】:

Angular 团队在引入模块时谈到了弃用组件级指令here 的原因。

弃用

将指令和管道导入组件的能力将是 已弃用。这意味着在弃用以下属性后 将被删除:@Component.directives@Component.pipes

为什么

保留@Component.directives/pipes 会导致以下问题:

两个作用域

它创建了两个范围:模块范围和组件范围。模块 scoped 与 ES6 模块的工作方式非常相似。结果,它是 易于向用户解释。我们必须拥有它以符合开发人体工程学。 组件范围是独一无二的,更难解释。

打破 ES6 心智模型

拥有组件范围打破了 ES6 的思维模型。在 ES6 中使用 您必须从模块中导入它的令牌。令牌不只是出现 从哪儿冒出来。使用材料组件很容易解释 您需要导入正确的模块。因为那是你会做的 使用 ES6。

没有人会使用它

模块创建足够小的范围以避免冲突,它们是 更符合人体工程学。因为使用模块更符合人体工程学, Component.directives 选项将不会在实践中使用。作为一个 新的 Angular 用户我必须使用模块来获取我的表单和常用的 指令,所以我很自然地会在那里添加我自己的指令。

没有什么可以阻止您拥有一个只有 exports 单个组件的模块,这将允许您将任何指令和管道限定到该特定组件,这比有效地拥有组件更一致且更容易推理在某些情况下能够成为自己的模块。

【讨论】:

  • 感谢您的澄清。
猜你喜欢
  • 2014-07-10
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 2013-05-14
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多