【问题标题】:AngularJS element directives not displaying when using self-closing tags使用自闭合标签时不显示 AngularJS 元素指令
【发布时间】:2013-08-08 19:37:21
【问题描述】:

我的 html 文件中有指令

<add />
<back />

指令在表单上

.directive('add', ['$window', ...

.directive('back', ['$window', 

这很好用。

如果我将指令更改为驼峰式:

.directive('addPlayer', ['$window', ...

<add_player />
<back />

<add:player />
<back />

显示正常而

<add-player />  regular dash
<back />

仅显示&lt;add-player&gt;,之后的所有内容均不显示。

有什么想法吗?

编辑:

我在这里也有同样的行为

http://plnkr.co/edit/cpP4c2TyZwv5Y4BrNUBb?p=preview

【问题讨论】:

标签: angularjs directive


【解决方案1】:

为了解决您的问题,我引用 AngularJS 团队的官方声明:(原文如此)

html 规范定义的自闭合或 void 元素对于浏览器解析器来说是非常特殊的。您不能自己制作,因此对于您的自定义元素,您必须坚持使用非 void 元素 (&lt;foo&gt;&lt;/foo&gt;)。

这不能改变角度。

- 伊戈尔米纳尔

来源:https://github.com/angular/angular.js/issues/1953#issuecomment-13135021

关注AngularJS issue's page 上的其余对话,他们讨论了使用XHTML 提供具有浏览器可接受的自动关闭标签的内容的可能性。但是请注意,AngularJS 并不完全支持它。

【讨论】:

  • 在这上面花了 2 个小时。没想到自动关闭标签会如此烦人和危险。在使用 Angular 时,很长一段时间都不会使用自闭合标签。顺便谢谢你的回答。
  • 那为什么在 reactJS 中允许呢? react-redux.js.org/introduction/…
  • @squirrelsareduck - React 使用 JSX,它看起来很像 HTML,但实际上并非如此。您链接到的代码不是直接注入浏览器的代码。将 renders 反应到 JavaScript。在Babbel REPL 上查看实际情况
【解决方案2】:

HTML 规范不允许在非空元素上使用自闭合标签。

HTML语法规则[W3C]

元素有一个开始标签来指示它们从哪里开始。非空元素有一个结束标记来指示它们的结束位置。
开始标签由以下部分组成,完全按照以下顺序:

  1. 一个“
  2. 元素的标签名称。
  3. (可选)一个或多个属性,每个属性前面必须有一个或多个空格字符。
  4. (可选)一个或多个空格字符。
  5. 可选的“/”字符,仅当元素是空元素时才可能出现。
  6. 一个“>”字符。

在 HTML5 规范中有有限数量的void elements。以下是完整列表:

area, base, br, col, command, embed, hr, img, input, @98765338@, @987 、paramsourcetrackwbr

到底发生了什么

浏览器的解析器必须监听规范。由于在非空元素标签中使用斜线是无效的,因此解析器会忽略结尾的/&gt;,而&lt;back /&gt; 表示&lt;back&gt;。因此,您永远不会关闭阻止其他元素工作的第一个元素。

Plunker 你有:

<body>
   <back></back>
   Self closing <back />
   Self closing <back />
</body>

解析成

<body>
   <back></back>
   Self closing <back>
      Self closing <back>
    </back>
  </back>
</body>

然后,您在指令中指定 template: '&lt;button&gt;back&lt;/button&gt;',该指令将 back(及其子项)替换为指定的 HTML,结果:

<body>
   <back>
       <button>back</button>
   </back>
   Self closing <back>
       <button>back</button>
   </back>
</body>

那我该怎么办?

全部使用&lt;back&gt;&lt;/back&gt;,它会正常工作。或者,您可以使用元素属性:&lt;div back="attr"&gt;&lt;/div&gt;

有关详细信息,请参阅以下讨论:

【讨论】:

【解决方案3】:

我最近遇到了同样的问题,并设法通过不使用自闭合标签来解决它。试试&lt;add-player&gt;&lt;/add-player&gt;,而不是自动关闭的版本。

我不知道为什么自闭标签不能与指令标签名称中的破折号一起使用。当天进行了快速研究,并没有在 HTML/XHTML 方面找到任何东西。也许是 Angular 中的错误/限制?

【讨论】:

  • 是的,看起来 只是启动它,所以我可以放 并且它可以工作。奇怪的是,我让它们中的一些依次显示,而另一些则没有。但是文档使用,所以我想自闭的不是要走的路。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
  • 2021-11-20
相关资源
最近更新 更多