为什么AngularJS不建议使用XML命名空间?

11

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

来自AngularJS文档

如果您选择使用旧的ng:样式指令语法,则在HTML中包含XML命名空间可使IE正常工作(出于历史原因,我们不再推荐使用ng:)。

使用类似这样的内容似乎可以起作用:

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

正如这个 jsFiddle所示,很明显。

但它并不建议使用它,仅出于历史原因而支持它。有人可以指出这些原因是什么吗?作为一个Flex背景下的人,我认为XML名称空间很棒,我很想利用它们,但也许Angular采用前缀方式有强有力的理由?


这在使用AngularJS与SVG时很奇怪,因为SVG使用XML解析器。例如,data-*和ng-*在SVG中不合法(尽管某些浏览器可能允许)。但是,ng:*在SVG中是合法的。https://dev59.com/DWUp5IYBdhLWcg3wF0dq - John Henckel
2个回答

4
我也曾经想过这个问题。考虑两个独立的项目,“Widget Factory”和“Wombat Framework”,它们各自开发指令x。为避免命名空间冲突,首选做法是给指令名称加前缀,但在这种情况下,它们可能仍然会定义wf-x
如果我在包含这两个模块的应用程序中使用<div wf-x="something"></div>,会发生什么?有趣的是,Angular将附加并链接两个指令,按降序优先级链接每个指令。但这样产生正确结果的几率很低。如果两个指令都尝试添加控制器,Angular将引发错误,并且两个指令的语义以及对属性值和元素结构的期望很容易相互冲突。
在XML中,可以通过命名空间解决此问题。<div xmlns:wf1="..." wf1:x="something"></div><wf1:x xmlns:wf1="..."></wf1:x>不太美观,但它们清楚地描述了我们打算使用哪个指令。
为什么Angular不支持这个?XML命名空间并不常见,可能在一般HTML中得不到很好的支持,并且解析可能存在技术上的挑战。指令不仅支持元素和属性,还支持注释和CSS类,:在类名中必须以某种方式被破坏。然而,最简单的答案可能是,这还不是一个足够普遍的问题,不需要比今天使用的前缀更高级的东西。值得注意的是,angular当前的方法是Web Components推荐的方法。随着该标准的发展,我希望Angular能够跟进。Polymer组中也有关于这个主题的讨论

从属性命名的灵活性来看,我猜测Angular没有以命名空间感知的方式进行解析,而是对完全限定的属性名称应用文本转换,去除":"这样的分隔符并应用驼峰式大小写。他们可能建议不要使用ng:,因为这可能会让你误以为可以像XML定义的那样使用命名空间。 - Rich Remer

4
冒昧地说,Angular更专注于扩展HTML功能而不是XML,因此存在风险?

1
嗯,有点道理。HTML5 也不是纯粹的 XML 超集。 - Himanshu

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