Neden kullanıyor(!$.$kapsam$faz) $scope.$() uygulamak anti-desen?
Benim kod $scope.$apply
kullanmak gerek bazen atar bazen "halen devam digest" hata. Bu etrafında bir yol bulmaya başladım ve bu soru bulundu: Prevent error $digest already in progress when calling $scope.$apply(). Ancak yorum (ve açısal wiki) okuyabilirsiniz:
Eğer yapma (!$.$kapsam$faz) $scope.$() uygulamak demektir kapsam$.$() geçerli çağrı yığını içinde, çok yüksek değil.
Şimdi iki sorum var: 1. Neden tam olarak bu anti-desen? 2. Nasıl güvenli bir şekilde kullanmak kapsam$.$uygulanır?
Başka bir" "ilerleme Özet zaten" hata $zaman aşımı kullanarak gibi görünüyor: . önlemek için "çözüm
$timeout(function() {
//...
});
Bu gitmek için bir yoldur? Daha güvenli mi? İşte asıl soru: Nasıl yapabilirimtamamen"Özet zaten ilerleme" hata mı? bir olasılığı ortadan kaldırmak
PS: sadece ben kullanıyorum $scope.$non-angularjs eşzamanlı olmayan aramalar için geçerli. (bu kullandığınız kapsam $gereken durumlar vardır bildiğim kadarıyla.$eğer uygulanabilir) için yaptığınız değişiklikleri isterseniz uygulayın
CEVAP
Biraz daha kazma sonra her zaman güvenli $scope.$apply
kullanmak ister soru çözebildim. Kısa cevabı evet.
Uzun cevap:
Tarayıcınızın Javascript nasıl çalıştırdığını nedeniyle, iki sindirimi aramalar çarpışır mümkün değildirtesadüfen.
Yazdığımız JavaScript kodu tüm sırayla yürütür yerine tek seferde çalıştırmak değil. Bu dönüşlerin her baştan fasulye çuvalı bitirmek için çalışır, ve bir devre çalışırken, başka bir şey değil bizim tarayıcı olur. (http://jimhoskins.com/2012/12/17/angularjs-and-apply.html)
Dolayısıyla "sindirimi devam eden geçerli bir $uygulayın, örneğin dolar içeride kesilirken: ." sadece tek bir durumda ortaya çıkabilir: hata
$scope.apply(function() {
// some code...
$scope.apply(function() { ... });
});
Bu durum olabilirdeğilortaya çıkareğerkullandığımız kapsam$.örneğin setTimeout
geri arama gibi olmayan angularjs saf bir geri arama içinde geçerlidir. Aşağıdaki kodu 100% kurşun geçirmez değildir ve yokturhayırif (!$scope.$$phase) $scope.$apply()
yapmak gerekir
setTimeout(function () {
$scope.$apply(function () {
$scope.message = "Timeout called!";
});
}, 2000);
bu bile güvenli
$scope.$apply(function () {
setTimeout(function () {
$scope.$apply(function () {
$scope.message = "Timeout called!";
});
}, 2000);
});
NedirDEĞİLgüvenli $timeout - angularjs yardımcıları gibi - zaten senin için $scope.$apply
aramalar için):
$timeout(function () {
$scope.$apply(function () {
$scope.message = "Timeout called!";
});
}, 2000);
Bu da if (!$scope.$$phase) $scope.$apply()
kullanımı anti-desen-bir olduğunu açıklıyor. Sadece doğru şekilde $scope.$apply
kullanırsanız buna ihtiyacı yok: saf js çağırma gibi setTimeout
örneğin.
Daha ayrıntılı açıklama için http://jimhoskins.com/2012/12/17/angularjs-and-apply.html okuyun.
Neden MVC4 Anti-Desen Servis Bulucu ku...
Neden Veri Nesneleri anti-desen Transf...
Neden&; dizi yineleme için... "* o kad...
Neden insanlar BÖLÜM varsa Heroku kull...
AngularJS : çağrılırken hata sindirimi...