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 $digest
iç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
$digest
watch.get(scope)
watch.last
watch.last
$digest
dirty
true
dirty == true
$digest
$rootScope
$digest
Şimdi hakkında ngRepeat
. Her watch.get
çağrı için, koleksiyondaki nesneleri (dönen değeri getEntities
) önbellekte ( HashQueueMap
tarafından hashKey
) ek bilgilerle birlikte depolar . Her watch.get
çağrı ngRepeat
için, nesneyi hashKey
önbellekten almaya çalışır . Önbellekte yoksa, önbellekte ngRepeat
depolar, yeni kapsam oluşturur, üzerine nesne koyar, DOM öğesi oluşturur vb .
Şimdi hakkında hashKey
. Genellikle hashKey
tarafından üretilen benzersiz sayıdır nextUid()
. Ancak işlev olabilir . hashKey
gelecekteki 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 hashKey
ve yok ngRepeat
. Bu yüzden ngRepeat
her biri watch.get
yeni bir saat ile onun için yeni kapsam oluşturur {{entity.id}}
. Bu saat ilk önce watch.get
var watch.last == initWatchVal
. Yani watch.get() != watch.last
. Böylece $digest
yeni geçiş başlar. Böylece ngRepeat
yeni 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,
hashKey
onlar 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.