如果AngularJS-元素上有多个指令,其中一个是隔离作用域正确的话,隔离作用域绑定到指令上,那么为什么会有任何冲突呢?这个错误的文档说明了处理它们将导致冲突或不支持的配置
。我不同意这种说法。多个指令已经共享元素的作用域,这显然是会导致冲突或不支持的配置的地方。我试图寻找这个问题的原因,但没有任何结果。
可以有人解释/举个例子,在哪种情况下这确实会造成冲突或不支持的配置吗?
如果AngularJS-元素上有多个指令,其中一个是隔离作用域正确的话,隔离作用域绑定到指令上,那么为什么会有任何冲突呢?这个错误的文档说明了处理它们将导致冲突或不支持的配置
。我不同意这种说法。多个指令已经共享元素的作用域,这显然是会导致冲突或不支持的配置的地方。我试图寻找这个问题的原因,但没有任何结果。
可以有人解释/举个例子,在哪种情况下这确实会造成冲突或不支持的配置吗?
答案很简单——只需要一个作用域将子元素绑定到(参见源代码),因为在后代元素中进行的作用域属性分配需要有一个明确的目标。其余的问题在于措辞。
尽管以某种方式将创建隔离作用域称为“针对特定指令”(如链接答案所述),但这仅仅是因为请求隔离的指令是该元素上的指令之一,可以访问隔离作用域。因此,该作用域被创建为隔离该“DOM层次结构”的指令和子元素,使它们与其他元素隔离开来。
给多个指令相同的隔离作用域会冒险导致作用域绑定配置的冲突(多个指令可能尝试绑定到隔离作用域上的相同属性)。
一个简单而令人信服的论点是,{{插值表达式}}
和普通表达式
(提供给支持它们的指令)必须根据相同的作用域进行评估,否则整个过程将是一团糟。(对{{表达式}}
的插值是分开进行的,因此接受一个普通表达式
并在另一个属性中接受字符串
的指令可以配置为根据不同的作用域评估表达式。)
如果他们真的需要,他们可以访问隔离作用域(但这需要启用调试数据)。如果它们的优先级低于创建隔离作用域的指令,则可以在其链接函数中使用element.isolateScope()
(请参见演示)。
scope: { myData: '=' }
一个原因可能是函数isolateScope()
在单元测试指令中非常有用,它返回与元素相关联的隔离作用域。允许多个隔离作用域意味着这个函数会更加复杂,可能需要返回某种指令名称到隔离作用域对的哈希表。
无论这是否足以证明不允许多个隔离作用域的设计决策,我必须承认我不确定...