Kısa cevap : Gerçekten böyle bir işleve ihtiyacınız var mı yoksa özelliği kullanabilir misiniz? http://jsfiddle.net/awnqm/1/
Uzun cevap
Basit olması için sadece sizin durumunuzu açıklayacağım - nesne dizisi için ngRepeat. Ayrıca bazı ayrıntıları atlayacağım.
AngularJS, değişiklikleri tespit etmek için kirli kontrol kullanır . Uygulama başlatıldığında o ishal $digestiçin $rootScope. kapsam hiyerarşisi$digest için önce derinlik geçişi yapacak . Tüm kapsamlarda saat listesi vardır. Her saatin son değeri vardır (başlangıçta ). Tüm saatler için her kapsam için onu çalıştırır, mevcut değeri ( ) alır ve ile karşılaştırır . Geçerli değer değilse için eşit (ilk karşılaştırmak her zaman için) setleri için . Tüm kapsamlar işlendiğinde, başka bir derinlik-ilk geçişi başlatırsa . dirty == false veya geçiş sayısı == 10. olduğunda sona erer. İkinci durumda, "10 $ özet () yinelemeye ulaşıldı" hatası. günlüğe kaydedilecek.initWatchVal$digestwatch.get(scope)watch.lastwatch.last$digestdirtytruedirty == true $digest$rootScope$digest
Şimdi hakkında ngRepeat. Her watch.getçağrı için, koleksiyondaki nesneleri (dönen değeri getEntities) önbellekte ( HashQueueMaptarafından hashKey) ek bilgilerle birlikte depolar . Her watch.getçağrı ngRepeatiçin, nesneyi hashKeyönbellekten almaya çalışır . Önbellekte yoksa, önbellekte ngRepeatdepolar, yeni kapsam oluşturur, üzerine nesne koyar, DOM öğesi oluşturur vb .
Şimdi hakkında hashKey. Genellikle hashKeytarafından üretilen benzersiz sayıdır nextUid(). Ancak işlev olabilir . hashKeygelecekteki kullanım için oluşturulduktan sonra nesnede saklanır.
Örneğiniz neden hata oluşturuyor : işlev getEntities()her zaman yeni nesneyle dizi döndürür. Bu nesne önbellekte yok hashKeyve yok ngRepeat. Bu yüzden ngRepeather biri watch.getyeni bir saat ile onun için yeni kapsam oluşturur {{entity.id}}. Bu saat ilk önce watch.getvar watch.last == initWatchVal. Yani watch.get() != watch.last. Böylece $digestyeni geçiş başlar. Böylece ngRepeatyeni saatle yeni kapsam yaratır. Yani ... 10 geçişten sonra hata alırsınız.
Nasıl düzeltebilirsin
- Her
getEntities()aramada yeni nesneler oluşturmayın .
- Yeni nesneler oluşturmanız gerekiyorsa,
hashKeyonlar için yöntem ekleyebilirsiniz . Örnekler için bu konuya bakın .
Umarım AngularJS iç bileşenlerini bilen insanlar, bir konuda yanıldıysam beni düzeltir.