SORU
30 Kasım 2012, Cuma


Nasıl '' ifadesi unwatch için

Büyük bir dizi ile ng-repeat bir arkadaşım var.

Ng-tekrar çalıştığında, izole bir kapsam olarak kendisi dizinin bir kapsamda olmak üzere bu dizinin her öğesi ekler. O $sindirimi değişiklikler için tüm diziyi kontrol eder ve bunun üzerine, denetleme demektirher bir elemanındeğişiklikler için bu dizi.

Neden bahsettiğimi bir örnek olarak this plunker bkz.

Kullanın benim durumumda, ben asla onları izlemeye ihtiyacım yok benim dizinin tek bir öğesini değiştirin. Sadece bu durumda yeniden işleme bütünlük içinde, tablo-tekrar ng tüm diziyi, değiştireceğim. (Eğer yanılıyorsam bu bana bildirin lütfen

Bir dizi (say) 1000 satır, bu değerlendirmeye ihtiyacım yok 1000 daha fazla ifade.

Nasıl hala ana dizi izlerken watcher gelen her öğe deregister miyim?

Belki deregistering yerine sindirmek benim $daha fazla kontrol var ve bir şekilde tek tek her satır atlamak miyim?

Bu özel durum aslında daha genel bir sorun bir örnektir. $watch returns a 'deregisteration' function ama bir Direktif çoğu zaman hangi saatler, kayıt olduğunda yardım etmez, biliyorum.

CEVAP
30 Kasım 2012, Cuma


Her öğe izle değilsin büyük bir dizi ile bir tekrarlayıcı olması.

İhtiyacınız olacak oluşturmak için özel bir yönerge, bu bir argüman alır ve ifade için dizinizi, sonra da bağlama işlevi ... sadece izleyin bu diziyi, ve sen bağlantı aracılığıyla işlevini yenileme HTML (yerine kullanarak bir ng-repeat)

bir şey gibi (psuedo-kodu):

app.directive('leanRepeat', function() {
    return {
        restrict: 'E',
        scope: {
           'data' : '='
        },
        link: function(scope, elem, attr) {
           scope.$watch('data', function(value) {
              elem.empty(); //assuming jquery here.
              angular.forEach(scope.data, function(d) {
                  //write it however you're going to write it out here.
                  elem.append('<div>'   d   '</div>');
              });
           });
        }
    };
});

... tam bir baş belası gibi görünüyor.

Alternatif hackish yöntemi

$scope.$$watchers döngü ve $scope.$$watchers[0].exp.exp Eğer kaldırmak, ** 5 basit bir arama ile kaldırın istersin ifade eşleşip eşleşmediğini görmek için incelemek mümkün olabilir. PİTA burada, etiketler arasında Blah {{whatever}} Blah gibi şeyler ifade edilecek, ve hatta satırbaşları yer alacak.

İşin iyi tarafı, ng-tekrar kapsam $döngü ve her şeyi kaldırmak, açıkça istediğiniz saati eklemek için sadece o zaman mümkün olabilir... bilmiyorum.

Her iki şekilde de, bir hack gibi görünüyor.

Bir izleyici kaldırmak için yapılan kapsam$.$izle

$watch fonksiyon $watch tarafından döndürülen bir arama kaydı siliniyor:

Örneğin, bir zamanlar $watch tek bir yangın var:

var unregister = $scope.$watch('whatever', function(){ 
     alert('once!');
     unregister();
});

Elbette kaydını istediğin zaman işlevini çağırabilirsiniz... bu sadece bir örnekti.

Sonuç: gerçekten istiyorsun tam olarak yapmak için harika bir yol Yoktur

Ama bir şeyi düşünmek bile endişe yaratabilir mi? Ayrıca gerçekten kayıtları DOMElements onlarca her yüklenen binlerce olması iyi bir fikir mi? Düşünce için yiyecek.

Umarım yardımcı olmuştur.


2 (kaldırıldı kötü fikir) DÜZENLEYİN

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 1881 Animation

    1881 Animati

    5 EKİM 2013
  • EEVblog

    EEVblog

    4 NİSAN 2009
  • The Dubstep FX

    The Dubstep

    5 Mart 2011