Jawaban singkatnya : apakah Anda benar-benar membutuhkan fungsi seperti itu atau Anda dapat menggunakan properti? http://jsfiddle.net/awnqm/1/
Jawaban panjang
Untuk kesederhanaan saya hanya akan menjelaskan kasus Anda - ngRepeat untuk berbagai objek. Juga, saya akan menghilangkan beberapa detail.
AngularJS menggunakan pemeriksaan kotor untuk mendeteksi perubahan. Ketika aplikasi dijalankan berjalan $digestuntuk $rootScope. $digestakan melakukan penjelajahan kedalaman pertama untuk hierarki cakupan . Semua cakupan memiliki daftar jam tangan. Setiap jam tangan memiliki nilai terakhir (awalnya initWatchVal). Untuk setiap cakupan untuk semua jam tangan $digestmenjalankannya, mendapatkan nilai saat ini ( watch.get(scope)) dan membandingkannya watch.last. Jika nilai saat ini tidak sama dengan watch.last(selalu untuk perbandingan pertama) $digestset dirtyke true. Saat semua cakupan diproses jika dirty == true $digestmemulai traversal kedalaman pertama lainnya dari $rootScope. $digestberakhir ketika dirty == false atau jumlah traversals == 10. Dalam kasus terakhir, error "10 $ digest () iterations tercapai." akan dicatat.
Sekarang tentang ngRepeat. Untuk setiap watch.getpanggilan itu menyimpan objek dari koleksi (nilai yang dikembalikan getEntities) dengan informasi tambahan dalam cache ( HashQueueMapoleh hashKey). Untuk setiap watch.getpanggilan ngRepeatmencoba untuk mendapatkan objek hashKeydari cache-nya. Jika tidak ada di cache, ngRepeatsimpan di cache, membuat cakupan baru, meletakkan objek di atasnya, membuat elemen DOM, dll .
Sekarang tentang hashKey. Biasanya hashKeynomor unik dihasilkan oleh nextUid(). Tapi itu bisa berfungsi . hashKeydisimpan dalam objek setelah dibuat untuk digunakan di masa mendatang.
Mengapa contoh Anda menghasilkan kesalahan : fungsi getEntities()selalu mengembalikan array dengan objek baru. Objek ini tidak memiliki hashKeydan tidak ada di ngRepeatcache. Jadi ngRepeatpada masing-masing watch.getmenghasilkan ruang lingkup baru untuk itu dengan jam tangan baru {{entity.id}}. Jam tangan ini pertama kali watch.getpunya watch.last == initWatchVal. Jadi watch.get() != watch.last. Jadi mulailah $digestlintasan baru. Jadi ngRepeatbuat ruang lingkup baru dengan jam tangan baru. Jadi ... setelah 10 traverse Anda mendapatkan error.
Bagaimana Anda bisa memperbaikinya
- Jangan membuat objek baru di setiap
getEntities()panggilan.
- Jika Anda perlu membuat objek baru, Anda dapat menambahkan
hashKeymetode untuk mereka. Lihat topik ini sebagai contoh.
Semoga orang yang mengetahui internal AngularJS akan mengoreksi saya jika saya salah dalam sesuatu.