我有3个元素/范围彼此嵌套:
dirElement(scope A)
ngIfElement(scope B)
isolateDirectiveElement(scope C)
范围A包含变量test
。范围C通过属性双向绑定它,但在某些时候这个绑定停止工作 - 如果范围A值更新,即使在$ apply块内或者手动调用$ apply,Scope C的值也不会更新。检查3个范围我注意到,在某些时候,范围B也定义了test
。鉴于此,我认为以下情况属实:
对于每个$ apply周期,双向绑定尝试通过直接将其写入test
下的父作用域来更新父值。
对于每个$ apply循环,双向绑定尝试通过使其从父作用域读取test
来更新子进程。这只能读取它刚刚设置的值,并且由于没有其他东西在范围B上设置该值,因此范围C现在卡在test
的当前值。
基本上,您在ngModel中需要.
的相同原因适用于此方案。这似乎足够可信(我仍然认为(1)的行为是不必要的危险),但不知何故,这种情况从来没有给我带来过错(在隔离范围与从中拉取值的范围之间存在中间范围)而且我相当确定我之前以相同的方式组合了范围而没有错误。这种情况的一个温和的独特之处在于,范围A也是一个孤立的范围,但考虑到它的一切都是它的子范围/它的模板的一部分并不重要。
我是否更正,解决此问题的最佳方法是将test
更改为test.value
(并在范围A的控制器中将测试定义为{}
)?
答案 0 :(得分:0)
可能不是您想听到的,但最好的解决方案是切换到控制器作为工作方式,并完全停止使用$ scope。您可以在style-guide中了解相关信息。
您遇到的问题不是由ngIf指令上的.test
变量引起的,而是由转换的工作方式引起的。结合您正在使用的隔离,它变得不可预测。
是的,这很重要!我不记得这个版本,但这个“泄漏”#39;错误是固定的,并且在以后的AngualrJS版本中不再有用。 (而这甚至不是整个问题)这种情况的一个温和的独特之处在于,范围A也是一个孤立的范围,但考虑到它的一切都是它的子范围/它的模板的一部分并不重要。
当你切换到(不是那样)使用组件和控制器的新方法时,你真的会帮到自己。命名控制器将解决此问题。 将指令转换为组件,并使用控制器而不是链接函数实际上并不困难,它可以避免出现各种各样的意外情况。
哦,可能会介绍点,会有所帮助,但鉴于你的设置与隔离的美元范围,结合翻译,我不相信它在所有情况下100%治愈。