AngularJS $ watch两次调用

时间:2018-07-12 12:15:01

标签: angularjs watch

我有一个$ watch事件问题,在我的控制器中,我更改了一些数据,如下所示:

var tab = {};
    exp.plate.experiments.forEach(function (element) {
        if (data[element.well] === true) {
            tab[element.well] = element;
        }
    });

exp.curves = tab;

在指令中,我监视变量以检查更改,如下所示:

scope.$watch('curves', reloadChart, true);

这是我的reloadchart函数:

function reloadChart() {
    if (angular.isObject(scope.curves)) {
        console.log('RELOADCHART in progress')
    }
}  

我的问题是reloadChart函数被调用了两次,但是曲线值仅被更改了一次。

为什么?

编辑:

我发现了我的错误,在另一个指令中,我有一个函数可以复制曲线变量并对其进行一些更改,但我不知道角度监视也在复制所创建的变量上。

=>我替换此行:

legend = scope.curves;

对此:

legend = angular.copy(scope.curves)

1 个答案:

答案 0 :(得分:0)

从文档中:

  

在范围内注册了监视程序后,将异步调用侦听器fn(通过$ evalAsync)以初始化监视程序。在极少数情况下,这是不希望的,因为当watchExpression的结果未更改时会调用侦听器。要在侦听器fn中检测到这种情况,可以比较newValoldVal。如果这两个值相同(===),则由于初始化而调用了侦听器。

     

— AngularJS $rootScope/$scope API Reference - $watch

scope.$watch('curves', reloadChart, true);

function reloadChart(newVal,oldVal) {
    if (newVal === oldVal) return;
    //ELSE
    if (angular.isObject(scope.curves)) {
        console.log('RELOADCHART in progress')
    }
}