AngularJS指令限制A vs E

128

我在一个小团队中工作,使用AngularJS进行构建,并尝试保持一些基本标准和最佳实践;特别是考虑到我们在Angular方面相对较新。

我的问题与指令有关。 更准确地说,是关于 restrict 选项。

我们中的一些人正在使用 restrict: 'E',因此在html中有 <my-directive></my-directive>

其他人正在使用 restrict: 'A' 并在html中有 <div my-directive></div>

然后,当然,您可以使用 restrict: 'EA' 并使用上述任一选项。

目前这并不是什么大问题,但是当这个项目越来越大时,我希望任何查看它的人都能轻松理解发生了什么。

采用属性或元素方式做事情是否存在利弊?

如果选择元素而不是属性,是否有任何陷阱需要知道?

7个回答

189

restrict 用于定义指令类型,可能是 A (属性),C (类),E (元素),和 M (注释)。假设指令名称为 Doc

类型:用法

A = <div Doc></div>

C = <div class="Doc"></div>

E = <Doc data="book_data"></Doc>

M = <!--directive:Doc -->


3
比起@nikunj的回答来说,你的回答不是很清楚,但在看了他们的回答之后,我理解了你的回答。 - Alexander Mills
1
@AlexanderMills 不是因为这个答案更好或更差,但它几乎与AngularJS文档中的内容完全相同。 - ruffin
1
为那些想出这些简短字母让人们猜测其含义的开发者点赞。 - webmaster

106
根据文档

什么情况下应该使用属性而不是元素?当你创建一个控制模板的组件时,请使用元素。这种情况通常发生在为模板的某些部分创建特定领域语言时。当您使用新功能装饰现有元素时,请使用属性。

针对完整答案的陷阱,编辑以下评论:

假设您正在构建一个应在Internet Explorer <= 8上运行的应用程序。AngularJS团队已经从AngularJS 1.3中停止了对其的支持,因此您必须遵循以下指示才能使其正常工作:https://docs.angularjs.org/guide/ie


3
我已经仔细阅读了那些文件,但是错过了这一个 :) 谢谢。 - Darren Wainwright
3
本解释未涵盖任何陷阱和优缺点。 - Konstantin Krass
根据陷阱更新了我的答案。我没有提到优缺点,因为我认为我们更多地在讨论最佳实践,特别是当由Angular团队推荐和解释时。 - ngasull
1
我没有提到优缺点,因为我认为我们更多地在谈论最佳实践,特别是当它们由Angular团队推荐和解释时。嗯? :) - Alexander Mills

49

restrict选项通常设置为:

  • 'A' - 仅匹配属性名
  • 'E' - 仅匹配元素名
  • 'C' - 仅匹配类名
  • 'M' - 仅匹配注释

这是文档链接


simple and clean - Gaurav_0093

7

默认情况下,IE8不支持Element标签,您需要进行一些工作才能使IE8接受自定义标签。

使用属性而不是元素的一个优点是,可以在同一DOM节点上应用多个指令。这对于诸如表单控件之类的东西特别方便,因为您可以通过添加其他属性来突出显示、禁用或添加标签等,而无需将元素包装在一堆标签中。


5

据我所知,其中一个问题是IE对自定义元素的支持问题。引用自文档

3) 不要使用自定义元素标签,如<my-directive>(请使用属性版本<div my-directive>)

4) 如果您使用自定义元素标记,则必须执行以下步骤才能使IE 8及以下版本正常工作

<!doctype html>
  <html xmlns:ng="http://angularjs.org" id="ng-app" ng-app="optionalModuleName">
    <head>
      <!--[if lte IE 8]>
        <script>
          document.createElement('ng-include');
          document.createElement('ng-pluralize');
          document.createElement('ng-view');

          // Optionally these for CSS
          document.createElement('ng:include');
          document.createElement('ng:pluralize');
          document.createElement('ng:view');
        </script>
      <![endif]-->
    </head>
    <body>
      ...
    </body>
  </html>

4

注意事项:

  1. 在IE8中,使用自己的html元素(如<my-directive></my-directive>)需要解决问题才能正常工作(https://docs.angularjs.org/guide/ie)。
  2. 使用自己的html元素将导致html验证失败。
  3. 只有一个参数的指令可以这样做:

<div data-my-directive="第一个参数的值"></div>

而非这样:

<my-directive my-param="第一个参数的值"></my-directive>

由于上述2个原因,我们不使用自定义html元素。

第三方框架编写的每个指令可以以两种方式编写:

<my-directive></my-directive>

<div data-my-directive></div>

二者均可实现同样的功能。


1
如果您想创建一个具有相等的1个作用域参数的指令,使用A更容易。因为您不必创建额外的属性。 - Konstantin Krass
“Additional” 是什么意思?两个备选项都只有一个属性。 - a better oliver

2

元素存在两个问题:

  1. 旧浏览器支持不佳。
  2. SEO - Google搜索引擎不喜欢它们。

使用属性。


指令作为元素可能会导致SEO问题吗? 我很惊讶。那么replace属性设置为true呢? - chalasr
1
这些说法需要参考资料。第一点在其他地方已经相当被认可,但我很想看到关于第二点的来源。 - rinogo

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