2013-10-13 30 views
6

değişikliklerine yapılan güncellemeleri yönetiyor Angularjs için bir scrollspy modülü üzerinde çalışıyorum. Sayfanın dinamik içerikle uğraşması durumunda, scrollspy verilerinin (öğe konumları) hızlı bir şekilde güncelliğini kaybetmesi sorunuyla karşılaştım. Bu gibi konularla uğraşmanın açısal yolu nedir?Angularjs, DOM öznitelik değerlerinde

DOM manipülasyonunu gerçekleştiren herhangi bir yönerge $broadcast scrollspy modülünün dışarıdan baktığı bir olay varsa - konum verilerini yeniden konumlandırmasına izin veriyor mu?

Kaydırma modülünde $timeout ile scrollHeight değişikliği için her x saniye kontrol ediliyor mu?

Hatta daha da iyisi, bağlama ve DOM değeri değiştiğinde (offsetTop, offsetHeight, scrollHeight değil, veri niteliklerini gibi nitelikleri) özniteliği izlemek için bir yol var?

Güncelleme: Karanlık biraz bıçaklıyorum kodu olmadan Added code base to GitHub

+0

. Ne yazık ki, elementlerin loşluğunda değişiklikler için bir olay yok, bu yüzden bir yoklama $ timeout impl muhtemelen en iyi adaydır korkuyorum. En azından $ timeout.flush() ile kolayca test edilebilir.) – SonOfNun

+0

Buradaki şeytanlar avukat olmak, ama eğer eleman yükseklikleri değiştiyse, ama genel olarak "scrollHeight" yapmadı ... Aniden herşeyi kontrol etmeniz gerekiyor – Patrick

cevap

6

Dönüşüm Gözlemcileri ne yazık ki only supported by the latest browsers olan tesisin gerekli görünmektedir.

var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; 
if(MutationObserver) { 

    for (var i = 0; i < spyService.spies.length; i++) { 
     var spy = spyService.spies[i].scope.spy; 
     var target = document.getElementById(spy); 

     var config = { 
      attributes: true, 
      childList: true, 
      characterData: true, 
      subtree: true 
     }; 
     var observer = new MutationObserver(function(mutations) { 
      mutations.forEach(function(mutation) { 
       console.warn('mutation observation'); 
      }); 
     }).observe(target, config); 
    } 
} 
else { 
    console.warn('no mutation observers here'); 
    $interval(function() { 
     angular.element(document).ready(function() { 
      console.log('refreshing'); 
     }); 
    }, 2000); 

} 

Şu anda çalışmakta olan bir polfill arıyor.

DÜZENLEME: Mutasyon Gözlemcileri desteklenmiyorsa, yoklama olarak ek sorgulama eklendi.

0

, ama senin scrollspy modül onay $rootScope bir $digest çağrı aldığında her zaman öneririm. Yani $rootScope.$watch kullanın.

$rootScope.$watch(function() { 
    // Update scrollspy data here 
} 
+0

Üzgünüz, Buna geri dönmek için biraz zaman harcadım. GitHub'daki koda bağlantı eklendi. DOM güncellendikten ve oluşturulduktan sonra buna yeterince geç çağrılacak mı? – Patrick

+0

Evet, AngularJS, direktifleri ve denetleyicileri yüklemeyi ve onları bağlama işlemini tamamladıktan sonra çağrılmasın. –

+0

Ancak, muhtemelen sadece mevcut kod yapısı, $ digest sorunları içine girdi. Ne yazık ki bu sadece sorunun yarısını hallediyor (işe yarıyorsa). Tıklamadaki yüksekliğini değiştiren bir "div", örneğin "kapsam" olarak da adlandırılmadığı sürece yakalanamazdı. $ Apply(); 'temelde bir yeniden yazma yöntemini çağırmakla aynı gerekliliktir ... – Patrick

1

Böyle bir şey işe yaramalı ... CSS geçişleri ile güncellenmiş gibi görünmüyor. olasılıkla hızla kontrolden çıkmaya başladığını olur hadiseler çıkarır ve kesinlikle çalışmak için modül düşmanca hale getirebilmek için başka direktifler Kısıtlayıcı

scope.$watch(function(){ 
    return elem[0].offsetLeft; 
}, function(x){ 
    console.log('ITEM AT '+x); 
}); 
İlgili konular