AngularJS $观看莫名其妙地改变观察值的值

时间:2013-02-22 02:20:26

标签: angularjs watch directive

我正在尝试实施ng-showng-hide的animdated版本;我最初尝试使用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那样改变(因为它不应该)。

到底发生了什么事?

Plunker

1 个答案:

答案 0 :(得分:1)

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

我担心你的代码并不是最容易理解的,但问题似乎是在第87行的my-map.js中。而不是$compile(elm.contents())(scope);,你应该做{{1}为该信息框创建一个独立的范围。