Angular指令 - 元素或属性?

19

我是一个团队的成员,与大约6名UI开发人员一起工作,他们的技能水平参差不齐,几乎没有Angular经验。许多人都是承包商,对代码库的经验很少。该应用程序拥有非常花哨(复杂)的用户界面,并支持IE8+(希望很快支持IE9+)。

我们将使用指令来创建花哨的UI元素,所有这些指令都以“ipwr”为前缀,以避免名称冲突。我正在考虑是否强制要求开发人员为其指令指定“element”或“attribute”限制中的一个。只强制执行其中之一,以避免混乱和困惑。

我的问题是:对于指令,“element”或“attribute”哪一个更好或更受欢迎? 我最关心的是针对那些对Angular经验很少且不熟悉应用程序代码库的人来说易于使用,以减少错误,复制和粘贴行为等。

4个回答

32

Angular指南建议,当指令完全控制其模板时,例如渲染模板等情况下,应使用"element"限制。

对于属性,他们建议仅在向现有元素添加"行为"或装饰现有元素时使用它们。

例如,考虑ng-click指令,这是用作属性而不是元素,因为click指令只是将单击行为添加到某些元素中。

另一个例子是ng-repeat指令,它也用作属性而不是元素,因为它将重复使用它所在的元素。

现在,这个指导来自于Angular文档;但是,我不确定元素与属性会给你带来"更好"的方法,它更多的是一种约定。

现在如果您必须支持旧版浏览器,则可能要考虑使用注释或类指令。

我个人偏爱只使用属性限制;主要是因为初学Angular的人看到restrict以及可以使用的各种选项时会感到不知所措。


3
关于此主题的 AngularJS文档链接 - eikonomega
很好的限制选项分解。+1 - AndrewL64

8

在做这类决策时,我通常会参考John Papa AngularJS风格指南。他说:

当组件是独立的时,倾向于将其实现为元素;当它增强现有DOM元素时,则应该作为属性实现。


我已经遵循编码规范指南超过18个月了,这是一个非常好的文档,可以随时回顾和参考。 - Dan Atkinson

3
如果您想保持HTML有效,应该使用属性。例如,如果您有指令ipwr-modal,您可以将其声明为<div data-ipwr-modal="you-could-put-some-binding-here"></div>
然而,当创建具有自定义布局的指令时,最好使用元素声明(如果不需要使HTML有效)。这是更明显的方式来表明:“嘿,我们有一个自定义组件”。
这篇博客文章通过一些更多的想法来解释它。

2

需要注意的几个要点:

  1. 大多数情况下,属性是最好/最方便的选项(这不是偶然的默认选项)。

  2. 任何使用元素绑定指令可以使用属性绑定指令来完成。

  3. 有时候元素绑定指令可以更具描述性/可读性。

  4. 如果您希望您的代码通过某些类型的验证,应该使用属性。

  5. 由于您想支持IE8,请记住自定义标记有额外的开销(更多信息),这会影响可维护性。


顺便提一下,您不能限制指令仅限于元素(而不影响功能),因此更多是允许“元素”还是不允许。“元素”通常有多个指令,并且放置在同一元素上的指令可以相互合作和增强彼此的行为。因此,将指令的使用限制为“元素”意味着将每个元素的自定义指令数量限制为1,这会严重降低功能潜力。


说了这么多,我会做出以下选择:

  • 如果IE8不是问题,请同时使用两种方式(大多数情况下使用属性)。

  • 如果IE8(或自定义标记的开销)是问题,请仅使用属性。

  • 总的来说,如果只允许一种形式,则应该使用属性(可以在任何地方工作,没有额外的开销,提供所有功能)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接