Угловой цикл дайджеста

У меня проблема с моим приложением, потому что оно создает бесконечный цикл при попытке создать форму. Моя форма сгенерирована на основе json (пример в коде). Проблема возникает только тогда, когда я перехожу к другому шагу и возвращаюсь к форме. Я понятия не имею, что вызывает эту проблему, потому что это происходит только тогда, когда состояние загружается во второй раз. Возможно ли, что angular хранит наблюдателей, которые были созданы в предыдущем состоянии, и они просто перекрывают друг друга?

Вся идея этого приложения заключается в том, что у вас есть определение формы в разделе «форма», затем есть «схема», которая определяет каждый элемент модели, и в конце есть «модель», в которой хранятся все переменные.

<schema-form
    data-name     = "theemployeeform"
    data-schema   = "$ctrl.json.all_fields.schema"
    data-form     = "$ctrl.json.all_fields.form"
    data-model    = "$ctrl.json.model">
</schema-form>

Чтобы увидеть ошибку, откройте инспектор Chrome и выполните следующие действия: Главная -> Форма -> Главная -> Форма Error: [$rootScope:infdig]

https://plnkr.co/edit/nkdzwLuEO0RauZT1jpOJ?p=preview


person piro    schedule 29.06.2016    source источник


Ответы (2)


Посмотрите, создали ли вы собственные часы для свойства, которое находится в области действия, и пытаетесь изменить значение этого свойства каждый раз, когда часы выполняются, как показано ниже.

var app = angular.module('test', [])
app.controller('ctrl', function($scope) {
  $scope.val = 100;

  $scope.$watch('val',function(n,o){
     $scope.val= $scope.val+1;
  })

});

В приведенном выше примере создается бесконечный цикл дайджеста. Обычно циклы дайджеста выполняются максимум 10 раз и минимум 2 раза только для того, чтобы проверить, было ли изменено какое-либо свойство в часах или нет... в основном он выполняет грязную проверку.

person Rishi Tiwari    schedule 29.06.2016
comment
Это проблема, у меня были распространенные ошибки с наблюдателями, но я не создал часы (вручную). То же самое в примере, $watch не создается вручную и не изменяется в данных. Редактировать: если быть точным, внутри компонента элемента формы есть наблюдатели, но эти часы назначены указанной клавише, и эта клавиша не меняется. Проблема в том, почему эта ошибка появляется только при повторной загрузке состояния, а не при первой загрузке. Даже если вы удалите эту ошибку наблюдателей. - person piro; 29.06.2016

Проблема была в директиве ng-include, которая зависела от переменной контроллера. Поскольку при изменении состояния ng-include не смог найти шаблон, он попытался загрузить index.html, и это вызвало проблему. Решение для этого состоит в том, чтобы скомпилировать шаблон вручную внутри компонента. Поскольку компонент не имеет compile в качестве директивы, нам нужно изменить $postLink() и включить в него компиляцию.

https://plnkr.co/edit/N2kUSCljMxaWTS7bZ2uC?p=preview

$element.contents().remove();
$templateRequest(templateUrl).then(function(html){
    var template = angular.element(html);
    var compiledContents = $compile(template);
    compiledContents($scope, function(clone){
         $element.append(clone);
    });
});

Это решает проблему.

person piro    schedule 30.06.2016