Javascript ngIf作用域定义自身的值

Javascript ngIf作用域定义自身的值,javascript,angularjs,Javascript,Angularjs,我有3个相互嵌套的元素/作用域: dirElement(scope A) ngIfElement(scope B) isolateDirectiveElement(scope C) 范围A具有变量测试。Scope C通过一个属性双向绑定到它,但在某个点上,这种绑定停止工作-如果Scope A值被更新,即使在$apply块内或手动调用$apply,Scope C的值也不会更新。检查3个作用域时,我注意到在某个点上,作用域B也定义了test。有鉴于此,我认为以下情况是正确的:

我有3个相互嵌套的元素/作用域:

dirElement(scope A)
   ngIfElement(scope B)
       isolateDirectiveElement(scope C)
范围A具有变量
测试
。Scope C通过一个属性双向绑定到它,但在某个点上,这种绑定停止工作-如果Scope A值被更新,即使在$apply块内或手动调用$apply,Scope C的值也不会更新。检查3个作用域时,我注意到在某个点上,作用域B也定义了
test
。有鉴于此,我认为以下情况是正确的:

  • 对于每个$apply循环,双向绑定都会尝试通过将父值直接写入
    test
    下的父范围来更新父值

  • 对于每个$apply循环,双向绑定都会尝试通过从父作用域读取
    test
    来更新子级。这只能读取它刚刚设置的值,因为没有其他东西在范围B上设置该值,所以范围C现在与
    测试的当前值保持一致

  • 本质上,您需要ngModel中的
    的原因也适用于此场景。这似乎足够可信(我仍然认为(1)的行为是不必要的危险),但不知何故,这种情况以前从未给我造成过错误(在隔离范围和它从中提取值的范围之间存在一个中间范围),我相当确定我以前以同样的方式组合过范围,没有错误。这种情况的一个温和的独特之处是,范围A也是一个孤立的范围,但考虑到所有内容都是它的子范围/它的模板的一部分,这并不重要


    解决这个问题的最佳方法是将
    test
    更改为
    test.value
    (并在scope A的控制器中将test定义为
    {}

    可能不是您想要听到的,但最佳解决方案是切换到controllerAs的工作方式,并完全停止使用$scope。你可以在网站上读到这方面的内容。 您遇到的问题不是由ngIf指令上的
    .test
    变量引起的,而是由转换工作方式引起的。再加上您正在使用的隔离,它变得不可预测

    这种情况的一个温和的独特之处是,范围A也是一个孤立的范围,但考虑到所有内容都是它的子范围/它的模板的一部分,这并不重要

    哦,是的,这很重要!我不记得这个版本了,但是这个“泄漏”错误已经修复,在以后的AngualrJS版本中不再工作。(这甚至不是问题的全部)

    当您切换到(并非如此)使用组件和控制器的新方式时,您真的会帮自己一个忙。命名控制器将修复此问题。 将您的指令转换为组件,并使用控制器而不是链接函数实际上并不是那么困难,而且它可以让您避免类似这样的各种意外

    哦,也许引入点会有所帮助,但是考虑到你的设置是孤立的$scope,再加上转换,我不相信它在所有情况下都是100%治愈的