Soru Açısal izleme döngüsü veya sindirim döngüsü tamamlandığında işlev çağırma


Tüm izleme döngüsünü açısal olarak tamamladıktan sonra açısal işlevini çağırmanın herhangi bir yolu var mı?

gereklilik Kontrol cihazımın içinde birden fazla saat fonksiyonu var. Şimdi sadece tüm işlevler açısal olarak çalıştırıldıktan sonra bir işlev yürütmek istiyorum


25
2018-03-17 07:10


Menşei




Cevaplar:


Özetleme tamamlandıktan sonra geri arama yapmanın birkaç yolu vardır.

kullanma $$postDigest: $scope.$$postDigest akımdan sonra geri arama başlatır $digest döngüsü tamamlandı.

Ancak bu, bir sonraki özet döngüsünden sonra yalnızca bir kez çalışır. Her sindirim döngüsünden sonra çalışmasını sağlamak için $watch. Bu kod örneğine dayanmaktadır burada verilen

var hasRegistered = false;
$scope.$watch(function() {
  if (hasRegistered) return;
  hasRegistered = true;
  $scope.$$postDigest(function() {
    hasRegistered = false;
    fn();
  });
});

$watch Bir özet döngüsü sırasında birden çok kez tetiklenebilir, bu yüzden bir bayrak kullanırız hasRegistered önlemek $$postDigest geri arama birden çok kez kaydedilecek. Not: $$ postDigest başka bir özet döngüsünü tetiklemez. Yani herhangi bir modifikasyon $scope içeride $$postDigest dom'a yansıtılmayacak. $$ Bu, angularjs'deki özel bir işlev anlamına gelir, bu nedenle işlev kararlı değildir ve gelecekte değişebilir.

kullanma $timeout:

$timeout(function(){
 console.log("Running after the digest cycle");
},0,false);

Bu, mevcut özet döngüsü tamamlandıktan sonra çalışır. Not: Üçüncü argüman başka bir digest döngüsü tetiklemesini önlemek için false olarak ayarlanmıştır.


52
2018-03-17 08:03



bu sorudan geçebilir misin stackoverflow.com/questions/29002977/... - Shivek Parmar
$ Timeout yaklaşımı bir çekicilik gibi çalıştı! - Patrik Beck