Angular指令 - 元素还是属性?

时间:2014-05-28 04:50:02

标签: angularjs angularjs-directive maintainability

我是一个团队的一员,拥有大约6个UI开发人员,质量各异,而且没有Angular经验。许多人是承包商,对代码库的经验很少。该应用程序具有非常花哨(复杂)的UI。它支持IE8 +(很快就希望IE9 +)。

我们正在为应用程序的主要扩展引入Angular,并且我已被要求为团队编写有关使用Angular的指南。

我们将使用指令来创建精美的UI元素,所有元素都以" ipwr"为前缀。避免名字冲突。我试图决定是否要求开发者给出他们的指令限制"元素"或"属性"。只要一个,以避免混乱和混乱。

我的问题是:什么限制更好或更受欢迎指令,"元素"或"属性"? 我主要担心的是对于具有少量Angular经验且对应用程序代码库不熟悉,减少错误,复制和粘贴行为等的人的易用性。

4 个答案:

答案 0 :(得分:32)

角度指导说你应该使用"元素"限制,只要指令完全控制它的模板意味着它有一个模板,它正在渲染,等等。

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

例如,考虑到ng-click指令,这是一个不作为元素的属性,因为click指令只是将点击行为添加到某个元素。

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

现在,这个指导来自角度文件;但是,我不知道元素与属性是否会给你一个更好的"接近它更像是一个惯例。

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

我个人的偏好是只使用属性限制;主要是因为当他们看到限制以及可以使用的选项的变化时,刚开始角的人会不知所措。

答案 1 :(得分:8)

在做出这些类型的决定时,我通常会遵从John Papa AngularJS style guide。他说:

  

倾向于作为一个元素实现它的独立和作为一个元素   在增强其现有DOM元素时的属性。

答案 2 :(得分:3)

如果您想保持HTML有效,您可以使用属性,例如如果你有一个指令ipwr-modal,你可以将它声明为<div data-ipwr-modal="you-could-put-some-binding-here"></div>

但是,在使用自定义布局创建指令时,最好使用元素声明(如果您不需要使HTML有效)。这是更明显的说法:“嘿,我们这里有一个自定义组件。”

This blog post explains it with some more ideas

答案 3 :(得分:2)

需要考虑的一些要点:

  1. 大多数时间属性是最好/最方便的选项(它不是偶然的默认选项)。

  2. 您可以使用元素绑定指令执行任何操作,也可以使用属性绑定。

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

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

  5. 由于您希望支持IE8,请注意自定义代码会产生额外的开销( more info ),这会损害可维护性。


  6. <子> 顺便说一下,你不能仅仅将指令限制在元素上(不影响功能),所以更多的是允许元素&#39;或不。请注意,元素通常具有多个指令,并且放置在同一元素上的指令可以协作并增强彼此的行为。因此,将指令的使用限制为“元素”,意味着将每个元素的自定义指令的数量限制为1,这会严重降低功能潜力。


    那就是说,这就是我(&#39; d)所做的:

    • 如果IE8不是问题,请同时使用(主要是使用属性)。

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

    • 一般来说,如果只允许一个表格,那么它应该是属性(在任何地方都可以工作,没有额外的开销,提供所有功能)。