2016-12-19 7 views
0

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

apply/digest is already in progress 

Я familier с не использованием антишаблона и есть проверить мой codebase для вложенных приложений/дайджеста.

Проблема заключается в сторонних плагинах в этом случае FormEditor и Flatpickr. Я вложил FlatPickr (с угловым надстройкой) в файл формы formEditor cshtml, который дает мне неприятную ошибку.

Есть ли способ отслеживать местоположение всех запросов на применение и/или дайджест, которые присутствуют в моем проекте?

Или у кого-нибудь есть решение для formEditor с flatPickr и flatpickr угловой надстройкой?

FormEditor: https://github.com/kjac/FormEditor FlatPickr: https://github.com/chmln/flatpickr FlatPickr дополнения: https://www.npmjs.com/package/angular-flatpickr

РЕШЕНИЕ: Проблема была $ применять называется путем EventListener, который инжектируется применять в управлении применять/дайджеста. Используется $ timeout, как указано в ответе, помеченном как правильно. место было найдено, глядя в журнал ошибок, как предложено в комментариях

+0

Вы пробовали переходить через свой код с помощью отладчика JS, такого как предоставленный в Chrome? Можете ли вы поделиться с нами каким-либо кодом? –

+1

Вызывающий (файл и строка) указан в стеке вызовов ошибок. – estus

+0

К сожалению, кодовая база должна делиться большими, поэтому вопрос основан на принципе большей основы. Отладка Chrome дает мне пустую ассоциацию файлов, и все, что я получаю, является стандартной угловой ошибкой, которая не дает мне отладки, кроме того, что я знаю, что еще одно приложение выполняется. –

ответ

1

AngularJS автоматически запускает $ переваривать цикл во многих случаях (после нг-клик срабатывает, например), так что решение не найти все " apply/digest "в вашем коде, потому что это не поможет вам предотвратить эту ошибку.

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

Один подход можно оборачивать $ применить вызов с проверкой безопасности:

if(!$scope.$$phase) { 
    // place 3rd party updates to scope here 
    $scope.$apply(); 
} 

Проблема этого метода состоит в том, что иногда код не будет вызван.

Лучше подход будет обернуть его с $ таймаут 0:

$timeout(function(){ 
    // place 3rd party updates to scope here 
}); 

Таким образом, вы слиты более естественно в угловом переваривать цикла.

+0

Это был мой первоначальный подход. К сожалению, третьи стороны не ссылаются на $ apply, если я не делаю какой-то пользовательский ввод, и поэтому проблема довольно скрыта. Кроме того, предложения, которые у вас есть, находятся под зонтиком анти-шаблона, который я бы хотел избежать, чтобы я мог правильно адресовать эту проблему –

 Смежные вопросы

  • Нет связанных вопросов^_^