AngularJS $ watch的奇怪行为

时间:2018-07-03 12:13:17

标签: angularjs angularjs-directive broadcast watch

我使用广播来检查控制器中的指令是否更改了变量。

这是我的广播的播放方式(有效):

$rootScope.$broadcast(EVENTS.RELOAD, scope.values);

在这里,我在控制器中处理广播:

 $scope.$on(EVENTS.RELOAD, reloadCurves);

 function reloadCurves(e, data){
    console.log(exp.curves);

   /* console.log('reload asked : ', data); */

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

    console.log(exp.curves);
}

然后在另一个指令中,我检查曲线变量是否随着$ watch改变。该手表也可以工作,当我手动更改变量时,将触发手表。

我的问题很奇怪,在我的reloadCurves中,我有两个console.log,它们总是显示相同的对象,但通常第一个console.log必须输出一个空数组(或与第二个console.log不同的数组)第二个是foreach的结果。

所以有角度的认为曲线变量不会改变,也不要丢下我的第二条指令。

该怎么办?

编辑:

我将我的reloadCurves更改为:

function reloadCurves(e, data){
    console.log('reload asked : ', data);
    console.log(exp.curves);
    // Récuperer toute les experiments cochés (celle en true)
    var tab = [];
    exp.plate.experiments.forEach(function (element) {
        if (data[element.well] === true){
            tab[element.well] = element;
        }
    });

    exp.curves = tab;

    console.log(exp.curves);
}

所以现在第一和第二个console.log不同,但是曲线上的$ watch不会抛出

1 个答案:

答案 0 :(得分:0)

查看代码后,我认为您假设您的forEach循环至少迭代一次或多次。正如您所说的,您同时获得两个console.log输出,因此问题很简单。您的forEach循环没有任何时间在迭代。只需将控制台日志放入forEach循环中,就不会得到该日志。只要检查一下exp.plate.experiments中的内容,便可以对其进行修复。

修改

好像您要在角度世界之外更新模型。只需将其包装在$scope.$apply(fn)

function reloadCurves(e, data){
    console.log('reload asked : ', data);
    console.log(exp.curves);
    // Récuperer toute les experiments cochés (celle en true)
    $scope.$apply(function() {
        var tab = [];
        exp.plate.experiments.forEach(function (element) {
            if (data[element.well] === true){
                tab[element.well] = element;
            }
        });

        exp.curves = tab;
    });
    console.log(exp.curves);
}