我有一个$ 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)
答案 0 :(得分:0)
从文档中:
在范围内注册了监视程序后,将异步调用侦听器fn(通过$ evalAsync)以初始化监视程序。在极少数情况下,这是不希望的,因为当watchExpression的结果未更改时会调用侦听器。要在侦听器
fn
中检测到这种情况,可以比较newVal
和oldVal
。如果这两个值相同(===),则由于初始化而调用了侦听器。
scope.$watch('curves', reloadChart, true);
function reloadChart(newVal,oldVal) {
if (newVal === oldVal) return;
//ELSE
if (angular.isObject(scope.curves)) {
console.log('RELOADCHART in progress')
}
}