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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么多个指令不能在同一个元素上要求隔离范围?相关的知识,希望对你有一定的参考价值。

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

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

答案

Why can't multiple directives on the same element get separate isolated scopes

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

虽然在某种程度上,引用为“特定指令”创建的隔离范围(如linked answer所做的那样)是恰当的,但只有在请求隔离的指令是指令中唯一的指令时才是这样。在该元素上可以访问隔离范围。因此,创建范围是为了将指令和子元素与DOM的“级别”的其余部分隔离开来。

Why can't multiple directives get the same isolated scope

为多个指令提供相同的隔离范围可能会导致范围绑定配置发生冲突(多个指令可能会尝试绑定到隔离范围上的相同属性)。

Why can't directives with lower priority use the isolated scope

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

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

另一答案

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

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

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

   scope: { myData: '=' }

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

另一答案

一个原因可能是在单元测试指令中有用的函数isolateScope()返回与元素关联的隔离范围。允许多个隔离的范围将意味着此函数将更复杂,必须将指令名的某种散列返回到隔离的范围对。

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

以上是关于为什么多个指令不能在同一个元素上要求隔离范围?的主要内容,如果未能解决你的问题,请参考以下文章

附加到元素父级的模板上的隔离范围

AngularJS自定义验证指令 - 如何避免使用隔离范围

为 Angular 指令添加多个“要求”选项

为啥我应该在 AngularJS 中使用隔离范围指令?

AngularJS指令隔离范围和父范围

访问指令的隔离范围与嵌入的内容