Lihat http://docs.angularjs.org/error/$rootScope:inprog
Masalah muncul ketika Anda memiliki panggilan ke $apply
yang 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 $apply
dijalankan secara tidak sinkron. Ini dapat dilakukan dengan menjalankan kode Anda di dalam panggilan $timeout
dengan penundaan diatur ke 0
(yang merupakan default). Namun, memanggil kode Anda di dalam $timeout
menghilangkan keharusan untuk menelepon $apply
, karena $ timeout akan memicu $digest
siklus 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 $timeout
akibat 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.