AngularJS: Net $ izle


277

AngularJS uygulamamda bir izleme fonksiyonum var.

$scope.$watch('quartzCrystal', function () {
   ...
}

Ancak, bazı koşullardan sonra (benim örneğimde, tek sayfalık uygulamamda sayfayı değiştirme ) Bu saati durdurmak istiyorum (zaman aşımını temizlemek gibi).

Bunu nasıl yapabilirim?

Yanıtlar:


520

$watchkayıt silme işlevini döndürür. Bunu çağırmak kayıttan silinir $watcher.

var listener = $scope.$watch("quartz", function () {});
// ...
listener(); // Would clear the watch

24
Bir denetleyici yaşam döngüsü sonunda ( $on('$destroy')a'da olduğu gibi ) tüm dinleyicilerinizin kaydını silmek için iyi bir uygulama olup olmadığını biliyor musunuz yoksa AngularJS bunlarla ilgilenecektir mi? Teşekkürler!
— yorch

81
Kapsam yok edildiğinde tüm izleyiciler kaldırılacak, bunları yönetmenize gerek yok
— Umur Kontacı

6
Burada konuyu açıklayan ilginç bir tartışma görebilirsiniz: github.com/angular/angular.js/issues/4574 Temel olarak, $ rootScope'a bir dinleyici atarsanız, kendinizin atamasını kaldırmanız gerekir, aksi takdirde devam eder $ kapsam değişiklikleri. $ Kapsamındaki gözlemciler $ kapsamıyla yok edilir ($ kapsamları Angular'da tekil değildir ve gerektiğinde oluşturulur ve yok edilir).
— Mladen Danic

3
Ancak, ben sadece değer var olup olmadığını denetlemek için izleyici istiyor ve sonra var olduğunda bazı değişiklikler yapmak ve sonra kendini de kayıt zaten denedim - var listen = $ scope. $ Watch ('mvIdentity.currentUser', function (currentUser ) {test = 1; console.log ("->" + $ scope.updateemail + "-" + test); listen ();});
— Harshit Laddha

4
@ UmurKontacı Aslında orijinal yorumunuz her vaka için doğru olmadığından deadman'ın yorumu kesinlikle geçerlidir.
— GFoley83

49

$ watch, arayabileceğiniz ve saatin kaydını silen bir işlev döndürür.

Gibi bir şey:

var unbindWatch = $scope.$watch("myvariable", function() {
    //...
});

setTimeout(function() {
    unbindWatch();
}, 1000);

14
Evet, saat içinde bağlanabilirsiniz! Basit kullanım durumu: watchFn'i yalnızca bir kez izlemek ve yürütmek, ardından izlemeyi bırakmak istiyorsunuz.
— Mike Rapadas

3
Bağlantıyı kaldırma işlevini çağırdıktan sonra tekrar çağırmak gibi saati yeniden hatırlayabilir miyim?
— Bruno Finger

Bu faydalı oldu. UnbindWatch'u zaman aşımına uğratmak testlerimde önemli görünüyor.
— eeejay

Bu durumda, kayıttan çıkabileceğiniz $ timeout kullanmalısınız!
— Ben Taliadoros

Zaman aşımlarından kaçınmak için en iyisi
— Davi Lima

25

Bir şey olduktan hemen sonra temizlemek istiyorsanız, geri aramanın içindeki saati de temizleyebilirsiniz. Bu şekilde $ saatiniz kullanılıncaya kadar etkin kalacaktır.

Bunun gibi ...

var clearWatch = $scope.$watch('quartzCrystal', function( crystal ){
  if( isQuartz( crystal )){
    // do something special and then stop watching!
    clearWatch();
  }else{
    // maybe do something special but keep watching!
  } 
}

4

Bir süre için $ izle çağırıyor dynamicallyve size önce kaydının silinmesi işlevi çağırmak zorunda onun örneklerini yaratacak $watchfonksiyonu

if(myWatchFun)
  myWatchFun(); // it will destroy your previous $watch if any exist
myWatchFun = $scope.$watch("abc", function () {});

4

İdeal olarak, kapsamdan çıktığınızda her özel saat kaldırılmalıdır.

Daha iyi bellek yönetimi ve daha iyi uygulama performansı sağlar.

// call to $watch will return a de-register function
var listener = $scope.$watch(someVariableToWatch, function(....));

$scope.$on('$destroy', function() {
    listener(); // call the de-register function on scope destroy
});

4

Çok fazla izleyiciniz varsa ve hepsini temizlemeniz gerekiyorsa, bunları bir diziye itebilir ve her $watchbir döngüyü yok edebilirsiniz .

var watchers = [];
watchers.push( $scope.$watch('watch-xxx', function(newVal){
   //do something
}));    

for(var i = 0; i < watchers.length; ++i){
    if(typeof watchers[i] === 'function'){
        watchers[i]();
    }
}

watchers = [];

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.