为什么多个指令不能在同一个元素上要求独立作用域?

15

如果AngularJS-元素上有多个指令,其中一个是隔离作用域正确的话,隔离作用域绑定到指令上,那么为什么会有任何冲突呢?这个错误的文档说明了处理它们将导致冲突或不支持的配置。我不同意这种说法。多个指令已经共享元素的作用域,这显然是会导致冲突或不支持的配置的地方。我试图寻找这个问题的原因,但没有任何结果。

可以有人解释/举个例子,在哪种情况下这确实会造成冲突或不支持的配置吗?

3个回答

8

为什么同一元素上的多个指令无法获得单独的隔离作用域

答案很简单——只需要一个作用域将子元素绑定到(参见源代码),因为在后代元素中进行的作用域属性分配需要有一个明确的目标。其余的问题在于措辞。

尽管以某种方式将创建隔离作用域称为“针对特定指令”(如链接答案所述),但这仅仅是因为请求隔离的指令是该元素上的指令之一,可以访问隔离作用域。因此,该作用域被创建为隔离该“DOM层次结构”的指令和子元素,使它们与其他元素隔离开来。

为什么多个指令不能共享相同的隔离作用域

给多个指令相同的隔离作用域会冒险导致作用域绑定配置的冲突(多个指令可能尝试绑定到隔离作用域上的相同属性)。

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

一个简单而令人信服的论点是,{{插值表达式}}普通表达式(提供给支持它们的指令)必须根据相同的作用域进行评估,否则整个过程将是一团糟。(对{{表达式}}的插值是分开进行的,因此接受一个普通表达式并在另一个属性中接受字符串的指令可以配置为根据不同的作用域评估表达式。)

如果他们真的需要,他们可以访问隔离作用域(但这需要启用调试数据)。如果它们的优先级低于创建隔离作用域的指令,则可以在其链接函数中使用element.isolateScope()(请参见演示)。


我能把你问题标题里的“新/隔离作用域”缩短成只有“隔离作用域”吗? - hon2a

1
这可能是因为作用域与元素级别相关联(据我所知)。因此,在给定的元素上,只有一个与之关联的作用域,可以是父级、子级或隔离级别之一。AngularJS指南中的作用域文档也引用了这一点(https://docs.angularjs.org/guide/scope)。
没有任何元素可以有多个关联的作用域(出于设计考虑),因为作用域代表应用程序结构以及任何给定元素的上下文。
因此,当同一元素上的两个指令要求隔离作用域时,AngularJS会意识到它必须创建两个不同的作用域来满足完全相同的元素,这不是受支持的行为。唯一的方法将是以某种方式合并两个作用域,以允许其基本假设,但如果两个隔离作用域都要求绑定到相同的作用域变量,则可能会发生冲突。
   scope: { myData: '=' }

现在,如果两个指令都要求或向作用域添加某些函数,则取决于哪个指令先执行,您将进入未知领域。

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Dororo

1

一个原因可能是函数isolateScope()在单元测试指令中非常有用,它返回与元素相关联的隔离作用域。允许多个隔离作用域意味着这个函数会更加复杂,可能需要返回某种指令名称到隔离作用域对的哈希表。

无论这是否足以证明不允许多个隔离作用域的设计决策,我必须承认我不确定...


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