SORU
12 Mart 2014, ÇARŞAMBA


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
12 Mart 2014, ÇARŞAMBA


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Fubar Protocol

    Fubar Protoc

    21 AĞUSTOS 2010
  • Glyn Dewis

    Glyn Dewis

    25 AĞUSTOS 2007
  • TV and Lust

    TV and Lust

    26 HAZİRAN 2006