Див. Http://docs.angularjs.org/error/$rootScope:inprog
Проблема виникає, коли у вас є виклик, $applyякий іноді запускається асинхронно поза кодовим кодом (коли слід застосовувати $ apply), а іноді синхронно всередині кутового коду (що викликає $digest already in progressпомилку).
Це може статися, наприклад, коли у вас є бібліотека, яка асинхронно отримує елементи з сервера та кешує їх. Перший раз, коли запитується елемент, він буде отриманий асинхронно, щоб не блокувати виконання коду. Вдруге, однак, елемент вже знаходиться в кеші, тому його можна буде отримати синхронно.
Спосіб запобігання цієї помилки - забезпечити $applyасинхронний запуск коду, що викликає . Це можна зробити, запустивши свій код всередині дзвінка $timeoutз встановленою затримкою 0(яка є типовою). Однак виклик коду всередині $timeoutзнімає необхідність викликати $apply, оскільки $ timeout запустить ще один $digestцикл, який, у свою чергу, зробить усі необхідні оновлення тощо.
Рішення
Словом, замість цього:
... your controller code...
$http.get('some/url', function(data){
$scope.$apply(function(){
$scope.mydate = data.mydata;
});
});
... more of your controller code...
зробити це:
... your controller code...
$http.get('some/url', function(data){
$timeout(function(){
$scope.mydate = data.mydata;
});
});
... more of your controller code...
Виклик лише $applyтоді, коли ви знаєте, який код працює, він завжди буде виконуватись поза кодовим кодом (наприклад, ваш дзвінок до $ застосовуватиметься всередині зворотного дзвінка, який викликається кодом поза вашим кодовим кодом).
Якщо хтось не знає про якийсь негативний недолік для використання $timeoutнад $apply, я не бачу, чому ви не завжди могли використовувати $timeout(з нульовою затримкою) замість цього $apply, оскільки це зробить приблизно те саме.