为什么多个指令不能在同一个元素上要求隔离范围?

时间:2014-12-15 14:05:03

标签: javascript angularjs angularjs-scope

如果Angularjs - Multiple directives on element with one being isolate scope是正确的,隔离范围与指令绑定,那么为什么会有任何冲突呢?此错误的文档指出processing them would result in a collision or an unsupported configuration。我不买这个。多个指令已经共享元素的范围,这肯定会在碰撞/不支持的配置中出现。我已经尝试在此寻找“为什么”,但是空手而归。

有人可以解释/举例确实会造成碰撞或不支持的配置吗?

3 个答案:

答案 0 :(得分:7)

为什么同一元素上的多个指令可以获得单独的隔离范围

答案很简单 - 只需要一个范围将子元素绑定到(see source),因为在子元素中完成的范围属性的赋值需要有一个明确的目标。其余的是措辞问题。

虽然在某种程度上适当地引用正在创建的隔离范围"对于该特定指令" (正如linked answer所做的那样),只是在某种意义上,请求隔离的指令是该元素上唯一一个指令才能访问隔离范围。因此,创建范围是为了将指令和子元素与其余的"级别"隔离开来。 DOM。

为什么多个指令不能获得相同的隔离范围

赋予多个指令相同的隔离范围会冒成范围绑定配置的冲突(多个指令可能会尝试绑定到隔离范围上的相同属性)。

为什么具有较低优先级的指令不能使用隔离范围

一个简单而有说服力的论点是元素上的{{interpolated.expressions}}需要与plain expressions(提供给支持它们的指令)相同的范围进行评估,否则整个事情就是总计一塌糊涂。 ({{expressions}}的插值是单独完成的,因此在一个属性中接受plain expression而在另一个属性中接受String的指令可以使用针对不同作用域评估的表达式进行配置。)

如果确实需要,他们可以访问隔离范围(但这需要启用Debug Data)。如果它们的优先级低于创建隔离范围的指令,则只需在其链接函数see demo中使用element.isolateScope()

答案 1 :(得分:1)

这可能是因为范围与元素级别(AFAIK)相关联。因此,在给定元素处,只有一个与之关联的范围,可以是Parent,Child或Isolated之一。 AngularJS指南中的Scope文档也引用了这个(https://docs.angularjs.org/guide/scope

任何元素都不能有多个与之关联的范围(按设计),因为范围代表应用程序结构以及任何给定元素的上下文。

因此,当同一元素上的两个指令要求隔离范围时,AngularJS认识到它必须创建两个不同的范围来迎合完全相同的元素,这不是受支持的行为。然后,唯一的方法是以某种方式合并两个范围以允许其基本假设,如果两个隔离的范围都要求绑定到相同的范围变量,则可能导致冲突,如

   scope: { myData: '=' }

现在,如果两个指令都要求这个,或者将某些函数添加到作用域,那么根据首先执行的指令,您将进入未知区域。

答案 2 :(得分:1)

一个原因可能是在单元测试指令中有用的函数isolateScope()返回与元素关联的隔离范围。允许多个独立的作用域意味着这个函数会更复杂,不得不将某些指令名称的哈希值返回给孤立的作用域对。

这是否足以证明设计决定不允许多个孤立的范围,我不得不承认我不确定......