【问题标题】:ng-app vs. data-ng-app, what is the difference?ng-app vs. data-ng-app,有什么区别?
【发布时间】:2013-05-11 11:44:18
【问题描述】:

我目前正在查看this start tutorial videoangular.js

在某个时刻(12'40" 之后),演讲者指出ng-appdata-ng-app="" 属性在<html> 标记内或多或少是等价的,ng-model="my_data_bindingdata-ng-model="my_data_binding" 也是如此。然而,演讲者表示 html 将通过不同的验证器进行验证,具体取决于使用的属性。

您能解释一下ng- 前缀和data-ng- 前缀这两种方式之间的区别吗?

【问题讨论】:

标签: html angularjs


【解决方案1】:

好问题。区别很简单——这两个除了之间绝对没有区别,某些HTML5验证器会在ng-app这样的属性上抛出错误,但它们不会对以@为前缀的任何东西抛出错误987654323@,点赞data-ng-app

所以要回答您的问题,如果您希望更轻松地验证您的 HTML,请使用 data-ng-app

有趣的事实:您也可以使用x-ng-app 达到相同的效果。

【讨论】:

  • data- 前缀是否会阻止 ng 属性正常工作? (例如,“data-ng-repeat”)?
  • 手动剥离data-x- 似乎是在浪费CPU 周期。为什么不能将 HTML 验证规则更改为接受ng- 的东西?
  • @DaveAlger:按照你说的做是个坏主意。如果外面有很多像 Angular 这样的著名工具,它们有不同的前缀,你希望 HTML 跟随它们来添加它们的前缀?!?!正如 Krumia 所说,这是扩展 HTML 的方式。
【解决方案2】:

区别在于自定义data-*属性在HTML5 specification中有效。因此,如果您需要验证标记,则应使用它们而不是 ng 属性。

【讨论】:

  • 我从规范中了解到 data-* 会起作用,因为它只是验证 html。但是为什么 x-* 会起作用呢?他们在规范中对此没有任何描述。
  • x-* 保留供浏览器使用。至于你为什么 x 工作的问题,要么将作为角度工作,特别是通过将其编码到它们的框架中来确保它适用于任一 data/x。如果你问为什么 x 对 Angular 起作用,那是另一场辩论。两者都有很好的论据。在 SO 上看到这个答案:stackoverflow.com/a/17902387/339803 该页面上的另一个答案似乎认为 x 是用于 XHTML,但我不确定。在阅读完所有内容后,看看你能做些什么。 HTML5 规范还说浏览器/供应商使用:w3.org/html/wg/drafts/html/master/single-page.html
【解决方案3】:

来自Angularjs Documentation

Angular 规范化元素的标签和属性名称以确定 哪些元素匹配哪些指令。我们通常指 指令由它们区分大小写的 camelCase 规范化名称(例如 模型)。但是,由于 HTML 不区分大小写,因此我们指的是 DOM 中的指令以小写形式表示,通常使用 DOM 元素上以破折号分隔的属性(例如 ng-model)。

归一化过程如下:

从元素/属性的前面去除 x- 和 data-。将 :、- 或 _ 分隔的名称转换为 camelCase。这里有一些等价的 匹配 ngBind 的元素示例:

基于上面的陈述,下面都是有效的指令

1. ng 绑定
2. ng:绑定
3. ng_bind
4. 数据-ng-绑定
5. x-ng-绑定

【讨论】:

  • 但它这样做只是为了与指令名称进行比较。它不会改变实际的属性。
  • 很高兴了解 -,: 和 _ 符号
【解决方案4】:

简答:

ng-modeldata-ng-model 是相同的和等价的!


为什么?

  1. 原因: data- 前缀
    HTML5 specification 要求任何自定义属性都以 data- 为前缀。

  2. 原因:ng-modeldata-ng-model 相同且等效。

AngularJS Document - Normalization

Angular 对元素的标签和属性名称进行规范化,以确定哪些元素与哪些指令匹配。我们通常通过区分大小写的camelCase 规范化名称(例如ngModel)来引用指令。然而,由于 HTML 不区分大小写,我们在 DOM 中以小写形式引用指令,通常在 DOM 元素上使用dash-delimited 属性(例如ng-model)。

规范化过程如下:
1. 从元素/属性的前面去除x-data-
2. 将:-_-分隔名称转换为camelCase

例如
以下形式都是等效的,并且与 ngBind 指令匹配:

<div ng-controller="Controller">
  Hello <input ng-model='name'> <hr/>
  <span ng-bind="name"></span> <br/>
  <span ng:bind="name"></span> <br/>
  <span ng_bind="name"></span> <br/>
  <span data-ng-bind="name"></span> <br/>
  <span x-ng-bind="name"></span> <br/>
</div>

【讨论】:

    【解决方案5】:

    如果你想让你的页面 HTML 有效,你可以使用 data-ng-,而不是 ng-。

    【讨论】:

    • OP 知道它们可以互换使用,但想知道如果它们“相同”工作,为什么它们可以使用。我相信解释是什么让它们与众不同将是一个更有价值的答案。
    【解决方案6】:

    如果您想在将服务器上的 html 或 html-fragments 提供给浏览器之前对其进行操作,那么您肯定希望使用 data-ng-xxx 属性而不仅仅是 ng-xxx 属性。

    1. 它使您的 html 有效,这意味着它可以被 html(基于服务器的)解析器使用,如 domdocument (php) 或其他。这些解析器经常在格式不正确的 html 上失​​败。
    2. Angular 对属性进行规范化,但请记住,这是在客户端上,而不是在服务器上。

    【讨论】:

      猜你喜欢
      • 2013-04-17
      • 2014-02-21
      • 2019-03-17
      • 2018-04-19
      • 2015-01-11
      • 2012-09-07
      • 2017-04-23
      相关资源
      最近更新 更多