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 progresshataya 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 $applyeşzamansız olarak çalışmasını sağlamaktır . Bu, kodunuzu bir $timeoutgecikme 0(varsayılan) olarak ayarlanmış bir çağrı içinde çalıştırarak yapılabilir . Ancak, kodunuzu içeride çağırmak arama $timeoutzorunluluğunu ortadan kaldırır $apply, çünkü $ timeout $digestkendi 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 $applykodu ç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 $applyher zaman kullanamadı neden görmüyorum $timeoutyerine (sıfır gecikme ile) $applyyaklaşık aynı şeyi yapacak gibi.