SORU
9 EYLÜL 2012, Pazar


Nasıl öğeleri ng-repeat ile bir işlev tarafından döndürülen bir Döngü?

Divs tekrar tekrar oluşturmak istiyorum, öğeleri nesneleri işlevi tarafından döndürülür. Ancak aşağıdaki kodu rapor hataları: 10 $digest() yineleme ulaştı. İptal ediliyor! jsfiddle işte: http://jsfiddle.net/BraveOstrich/awnqm/

<body ng-app>
  <div ng-repeat="entity in getEntities()">
    Hello {{entity.id}}!
  </div>
</body>

CEVAP
9 EYLÜL 2012, Pazar


Kısa cevapgerçekten ya özelliğini kullanabilirsiniz Bu işlevi ihtiyacınız var mı? http://jsfiddle.net/awnqm/1/

Uzun cevap

Basitlik için, davanız için tarif - nesnelerin dizi için ngRepet. Ayrıca, bazı detayları atla edeceğim.

AngularJS algılamak için dirty checking kullanır. Uygulama başlatıldığında $rootScope 46 *çalışır. $digest derinlik-ilk scope's hierarchy geçişi yapacak. Tüm kapsamları saatler listesi var. Her izle son değeri (başlangıçta initWatchVal) vardır. Tüm saatler için her bir kapsam için $digest çalışır, akım değeri (watch.get(scope)) alır ve watch.last karşılaştırır. Akım değeri watch.last (her zaman için ilk karşılaştırma) eşit değil ise $digest true dirty ayarlayın. Tüm kapsamları ise 13* $digest *başlarsa işlendiğinde başka bir-ilk derinlik $rootScope geçişi. $digest = = false veya sayı == 10 dolaşımları sona erer. İkinci durumda, hata "10 $digest() yineleme ulaştı" kaydedilir..

ngRepeat şimdi hakkında. watch.get Her bir çağrı için önbellekte ek bilgi (HashQueueMap hashKey) ile toplama nesneleri (getEntities dönen değeri saklar. watch.get Her çağrı için ngRepeat önbellek hashKey nesne almaya çalışın. Eğer önbellekte varsa, ngRepeat önbellekte depolar, yeni bir kapsam oluşturur, nesne koyar, DOM öğesi, etc oluşturur.

hashKey şimdi hakkında. Genellikle hashKey benzersiz bir sayı nextUid() tarafından oluşturulur. Ama function olabilir. hashKey gelecekte kullanmak için ürettikten sonra nesne saklanır.

Örnek hata neden oluşturur: fonksiyon getEntities() her zaman yeni bir nesne dizisi döndürür. Bu nesne hashKey yok ngRepeat önbellek yer almıyor. watch.get her ngRepeat {{entity.id}} yeni izle, ile yeni bir kapsam oluşturur. Bu ilk watch.get watch.last == initWatchVal izle. watch.get() != watch.last. $digest yeni geçiş başlar. ngRepeat yeni izle, ile yeni bir kapsam oluşturur. Yani ... 10 erişir sonra hata alıyorum.

Nasıl tamir edebilirsiniz

  1. getEntities() her çağrıda yeni nesneler oluşturun.
  2. Eğer yeni bir nesne oluşturmak istiyorsanız, onlar için hashKey yöntem ekleyebilirsiniz. Örnekler için this topic bkz.

Biliyorum insanlar iç eğer yanılıyorsam beni düzeltin bir şey AngularJS umarım.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • engineerguy

    engineerguy

    10 Ocak 2010
  • Roger Huffman

    Roger Huffma

    4 ŞUBAT 2007
  • WestsideMrArO

    WestsideMrAr

    6 EKİM 2010