AngularJS странное поведение с $ watch - PullRequest
0 голосов
/ 03 июля 2018

Я использую широковещательную рассылку, чтобы проверить мой контроллер, если директива изменяет переменную.

Вот как запускается моя трансляция (работает):

$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 голосов
/ 03 июля 2018

После просмотра вашего кода, я думаю, вы предполагаете, что ваш цикл 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...