AngularJS$watch莫名其妙地改变了被观察值的值

AngularJS$watch莫名其妙地改变了被观察值的值,angularjs,watch,directive,Angularjs,Watch,Directive,我正在尝试实现一个动画版本的ngshow和nghide;我最初尝试使用jQueryUI.toggle('slide',…),但由于$watch多次触发,我的元素先切换入,然后立即切换出(有时不止一次)。但我在AngularJS的github问题中看到,这是$watch的预期行为(肮脏检查) 所以我想,好吧,如果你被诅咒了,我将显式地显示或隐藏,而不是简单的切换:我将其分解以检查$watch的newValue值,如下所示: scope.$watch(condition, function mySh

我正在尝试实现一个动画版本的
ngshow
nghide
;我最初尝试使用
jQueryUI.toggle('slide',…)
,但由于
$watch
多次触发,我的元素先切换入,然后立即切换出(有时不止一次)。但我在AngularJS的github问题中看到,这是$watch的预期行为(肮脏检查)

所以我想,好吧,如果你被诅咒了,我将显式地显示或隐藏,而不是简单的切换:我将其分解以检查$watch的
newValue
值,如下所示:

scope.$watch(condition, function myShowHideAction(newValue,oldValue) {
    if ( newValue !== oldValue ) {
        if (newValue) {
            elm.show("slide", { direction: direction }, "slow");
        } else {
            elm.hide("slide", { direction: direction }, "slow");
        }
    }
}
点燃它,我看到了什么?切换

在输入了一些控制台日志后,我发现在$watch循环期间,我的条件值不知怎么地发生了变化(循环重复了6次,而不是一次,但这应该不在这里也不在那里)。但是,实际范围参数的值不会像
newValue
的值那样中途改变(因为它不应该改变)

到底发生了什么事


发生这种情况的原因是您的所有信息框共享相同的范围。如果在mySlide指令链接函数中放入
console.log(scope)
语句,您将看到它在同一个作用域中创建了多次。因此,在同一范围内,同一条件下有多个手表


恐怕您的代码不是最容易理解的,但问题似乎在第87行的my-map.js中。而不是执行
$compile(elm.contents())(范围),您可能应该执行
$compile(elm.contents())(scope.new())
为该信息框创建一个独立的作用域。

Hazzah!看来已经做到了,谢谢!顺便说一句,我的地图是基于Angular UI的地图指令的(我几乎没有改变任何东西——我认为只需为
infoBox
查找/替换
infoWindow
,所以代码大部分是他们的)。