Ошибка: $digest уже выполняется в angularjs при использовании предупреждения
Я просто получаю данные json от служб в контроллере.
И я использую функцию обратного вызова для печати сообщения об успешном завершении, когда оно загрузилось. Он работает нормально, но он также бросает ошибку, о которой я упоминал в вопросе
//JSON file
{
"pc":"name"
}
// angular services
var service = angular.module('Services', ['ngResource']).
factory('Widgets', function($resource){
return $resource('/json/home.json', {}, {
query: {method:'GET', params:{}, isArray:false}
});
});
//controller
function editWidget($scope, Widgets) {
$scope.data = Widgets.query(function(data) {
alert("Success Data Loaded ---> " + JSON.stringify(data.pc));
});
}
Ответы
Ответ 1
alert
, а также confirm
и prompt
приостанавливает выполнение кода (блокирует поток), в течение которого тайм-ауты и интервалы идут все в порядке, если они должны были срабатывать во время паузы. Цикл $digest
состоит из двух меньших циклов, которые обрабатывают очередь $evalAsync
и список $watch
. Очередь $evalAsync
используется для планирования работы, которая должна выполняться вне текущего фрейма стека, но перед визуализацией браузера. Обычно это делается с помощью setTimeout(0)
. Ваше предупреждение в течение этого времени вызывает проблему.
Ответ 2
Вы можете использовать $timeout для выполнения предупреждения после выполнения цикла дайджест и таким образом избежать этой ошибки.
$timeout(function () {
alert('Alert text');
});
Также не забудьте ввести $timeout в свою директиву
Ответ 3
if(!confirm('Your message')){
return false;
}else {
return false;
}
В обоих случаях возвращает false.
Ответ 4
@TheSharpieOne прав, он работает для меня.
function delayalert(messagestr){
setTimeout(function(){
alert(messagestr);
},0);
}