2013-02-22 62 views
0

我试图实施ng-showng-hide的animdated版本;我最初尝试使用jQueryUI.toggle('slide', …),但由于$watch多次触发,我的元素切换并立即切换(有时不止一次)。但是我在AngularJS的github问题中看到,那就是$ watch的预期行为(脏检查)。

所以我想,好吧,这一点EFF-你是该死的,我会明确地显示或隐藏,而不是简单的切换:我打破了下来,检查$手表的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那样发生变化(因为它不应该)。

这是怎么回事?

Plunker

回答

1

出现这种情况的原因是因为你的InfoBoxes到共享相同的范围。如果您在您的mySlide指令链接函数中放入console.log(scope)语句,您会看到它使用相同的作用域多次创建。因此,您可以在同一范围内使用多个相同条件的手表。

你的代码是不是最简单的跟随我很害怕,但这个问题似乎是在我的-map.js上线87而不是做$compile(elm.contents())(scope);,你应该做的$compile(elm.contents())(scope.$new());制作隔离的范围为那个信息框。

+0

Hazzah!这似乎做到了 - 谢谢!顺便说一下,我的地图是基于Angular-UI的地图指令(我几乎没有改变任何东西 - 我想为'infoBox'找到/替换'infoWindow',所以代码主要是他们的)。 – jacob 2013-02-22 18:20:04