Lihat http://docs.angularjs.org/error/$rootScope:inprog
Masalah muncul ketika Anda memiliki panggilan ke $applyyang kadang-kadang dijalankan secara asinkron di luar kode Angular (ketika $ berlaku harus digunakan) dan kadang-kadang sinkron dalam kode Angular (yang menyebabkan$digest already in progress kesalahan).
Ini dapat terjadi, misalnya, ketika Anda memiliki perpustakaan yang secara tidak sinkron mengambil item dari server dan menyimpannya. Pertama kali suatu item diminta, itu akan diambil secara tidak sinkron agar tidak memblokir eksekusi kode. Namun, kedua kalinya item tersebut sudah ada dalam cache sehingga dapat diambil secara serempak.
Cara untuk mencegah kesalahan ini adalah dengan memastikan bahwa kode yang dipanggil $applydijalankan secara tidak sinkron. Ini dapat dilakukan dengan menjalankan kode Anda di dalam panggilan $timeoutdengan penundaan diatur ke 0(yang merupakan default). Namun, memanggil kode Anda di dalam $timeoutmenghilangkan keharusan untuk menelepon $apply, karena $ timeout akan memicu $digestsiklus lain sendiri, yang pada gilirannya akan melakukan semua pembaruan yang diperlukan, dll.
Larutan
Singkatnya, alih-alih melakukan ini:
... your controller code...
$http.get('some/url', function(data){
$scope.$apply(function(){
$scope.mydate = data.mydata;
});
});
... more of your controller code...
melakukan hal ini:
... your controller code...
$http.get('some/url', function(data){
$timeout(function(){
$scope.mydate = data.mydata;
});
});
... more of your controller code...
Hanya panggilan $apply bila Anda tahu kode yang menjalankannya akan selalu dijalankan di luar kode Angular (mis. Panggilan Anda ke $ apply akan terjadi di dalam callback yang dipanggil oleh kode di luar kode Angular Anda).
Kecuali jika seseorang menyadari adanya kerugian yang merugikan $timeoutakibat penggunaan yang berlebihan $apply, saya tidak melihat mengapa Anda tidak selalu dapat menggunakan $timeout(dengan nol penundaan) $apply, karena hal itu akan melakukan hal yang kira-kira sama.