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.