Див. 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
, оскільки це зробить приблизно те саме.