如果Angularjs - Multiple directives on element with one being isolate scope是正确的,隔离范围与指令绑定,那么为什么会有任何冲突呢?此错误的文档指出processing them would result in a collision or an unsupported configuration
。我不买这个。多个指令已经共享元素的范围,这肯定会在碰撞/不支持的配置中出现。我已经尝试在此寻找“为什么”,但是空手而归。
有人可以解释/举例确实会造成碰撞或不支持的配置吗?
答案 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()
返回与元素关联的隔离范围。允许多个独立的作用域意味着这个函数会更复杂,不得不将某些指令名称的哈希值返回给孤立的作用域对。
这是否足以证明设计决定不允许多个孤立的范围,我不得不承认我不确定......