11

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

来自AngularJS 的文档

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

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

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

这个 jsFiddle可以看出。

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

4

2 回答 2

4

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

于 2013-10-28T09:50:39.980 回答
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>不漂亮,但它们清楚地描述了我们打算使用的指令。

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

于 2014-06-13T14:41:18.297 回答