【问题标题】:Why does AngularJS not recommend using XML namespaces?为什么 AngularJS 不推荐使用 XML 命名空间?
【发布时间】:2025-12-03 05:40:02
【问题描述】:

AngularJS 指令以 ng- 为前缀。为什么它坚持使用前缀而不是使用实际的 xml 命名空间?

来自AngularJS's documentation

如果您选择使用旧式指令语法 ng: 则在 html 中包含 xml-namespace 以使 IE 满意。 (这里出于历史原因,我们不再推荐使用 ng:。)

使用这样的东西似乎确实有效:

<html xmlns:ng="http://angularjs.org" ng:app="my-app">

this jsFiddle 可以看出。

但它不推荐使用它并支持它只是出于历史原因。有人可以指出这些原因可能是什么吗?来自 Flex 背景,我认为 XML 命名空间很棒,我很想利用它们,但也许 Angular 有充分的理由采用前缀方法?

【问题讨论】:

  • 这对于将 AngularJS 与 SVG 一起使用很奇怪,因为 SVG 使用 XML 解析器。例如,data-* 和 ng-* 在 SVG 中是不合法的(尽管某些浏览器可能允许这样做)。但是,ng:* 在 SVG 中是合法的。 *.com/questions/15532371/…

标签: javascript xml angularjs xml-namespaces


【解决方案1】:

我自己也想过这个问题。考虑两个独立的项目,“Widget Factory”和“Wombat Framework”,每个项目都开发指令x。为指令名称添加前缀是 preferred practice 以避免命名空间冲突,但在这种情况下,每个指令最终仍可能定义一个 wf-x

如果我在包含两个模块的应用程序中使用&lt;div wf-x="something"&gt;&lt;/div&gt; 会发生什么?有趣的是,angular 会同时连接两者,并按优先级降序连接。但这产生正确结果的几率很低。如果两个指令都尝试添加控制器,Angular 将引发错误,并且这两个指令的语义以及它们对属性值和元素结构的期望很容易相互冲突。

在 XML 中,这个问题通过命名空间来解决。 &lt;div xmlns:wf1="..." wf1:x="something"&gt;&lt;/div&gt;&lt;wf1:x xmlns:wf1="..."&gt;&lt;/wf1:x&gt; 并不漂亮,但它们清楚地描述了我们打算使用哪个指令。

为什么 Angular 不支持这个? XML 命名空间不常见,在一般 HTML 中可能得不到很好的支持,并且解析可能存在技术挑战。 cmets 和 CSS 类以及元素和属性都支持指令,并且 : 必须以某种方式在类名中被破坏。最简单的答案可能是,它还不是一个足够普遍的问题,需要比我们今天使用的前缀更高级的东西。需要注意的是,Angular 的当前方法是Web Components 推荐的方法。随着该标准的发展,我希望 Angular 能够跟踪它。 Polymer 组中也有 some discussion 讨论此主题。

【讨论】:

  • 从属性命名的灵活性来看,我的猜测是 Angular 并没有以命名空间感知的方式进行解析,而是将文本转换应用于完全限定的属性名称,剥离分隔符,如“: "并应用骆驼套管。他们可能建议不要使用 ng:因为它会让你相信你可以使用 XML 定义的命名空间。
【解决方案2】:

有听起来油嘴滑舌的风险,因为 Angular 专注于扩展 html 功能,而不是 xml?

【讨论】:

  • 嗯,这很有道理。 HTML5 也不是 XML 的纯超集。