Bkz. Http://docs.angularjs.org/error/$rootScope:inprog
Bu $apply
, bazen Açısal kodun dışında zaman uyumsuz olarak çalıştırıldığında ($ uygulamanız kullanıldığında) ve bazen de Açısal kod içinde ( $digest already in progress
hataya neden olan ) zaman uyumlu olarak çalıştırıldığında bir sorun olduğunda ortaya çıkar .
Örneğin, bir sunucudan öğeleri eşzamansız olarak getiren ve önbelleğe alan bir kitaplığınız olduğunda bu olabilir. Bir öğe ilk kez istendiğinde, kod yürütülmesini engellememek için eşzamansız olarak alınır. Ancak ikinci kez, öğe eşzamanlı olarak alınabilmesi için zaten önbellektir.
Bu hatayı önlemenin yolu, çağıran kodun $apply
eşzamansız olarak çalışmasını sağlamaktır . Bu, kodunuzu bir $timeout
gecikme 0
(varsayılan) olarak ayarlanmış bir çağrı içinde çalıştırarak yapılabilir . Ancak, kodunuzu içeride çağırmak arama $timeout
zorunluluğunu ortadan kaldırır $apply
, çünkü $ timeout $digest
kendi başına başka bir döngüyü tetikler , bu da gerekli tüm güncellemeleri vb.
Çözüm
Kısacası, bunu yapmak yerine:
... your controller code...
$http.get('some/url', function(data){
$scope.$apply(function(){
$scope.mydate = data.mydata;
});
});
... more of your controller code...
Bunu yap:
... your controller code...
$http.get('some/url', function(data){
$timeout(function(){
$scope.mydate = data.mydata;
});
});
... more of your controller code...
Yalnızca $apply
kodu çalıştıran kodun her zaman Açısal kodun dışında çalıştırılacağını bildiğinizde arayın (ör. $ Apply çağrınız, Açısal kodunuzun dışındaki kod tarafından çağrılan bir geri arama içinde gerçekleşir).
Birisi kullanmanın bazı etkili dezavantaj farkında olmadığı sürece $timeout
üzerinde $apply
her zaman kullanamadı neden görmüyorum $timeout
yerine (sıfır gecikme ile) $apply
yaklaşık aynı şeyi yapacak gibi.