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
,所以代码大部分是他们的)。