คำตอบสั้น ๆ : คุณต้องการฟังก์ชั่นดังกล่าวจริงๆหรือคุณสามารถใช้คุณสมบัติได้? http://jsfiddle.net/awnqm/1/
คำตอบยาว
เพื่อความง่ายฉันจะอธิบายเฉพาะกรณีของคุณ - ngRepeat สำหรับอาร์เรย์ของวัตถุ นอกจากนี้ฉันจะไม่ใส่รายละเอียดบางอย่าง
AngularJS ใช้การตรวจสอบสกปรกเพื่อตรวจจับการเปลี่ยนแปลง เมื่อโปรแกรมประยุกต์จะเริ่มต้นมันจะทำงานสำหรับ$digest
จะทำข้ามความลึกเป็นครั้งแรกสำหรับลำดับชั้นขอบเขตของ ขอบเขตทั้งหมดมีรายการนาฬิกา นาฬิกาแต่ละเรือนมีค่าสุดท้าย (เริ่มแรก) สำหรับขอบเขตสำหรับนาฬิกาทุกแต่ละมันวิ่งได้รับค่าปัจจุบัน ( ) และเปรียบเทียบกับ ถ้าค่าปัจจุบันไม่เท่ากับ(เสมอแรกเปรียบเทียบ) ชุดที่จะ เมื่อขอบเขตทั้งหมดจะถูกประมวลผลถ้าจะเริ่มต้นอีก traversal ลึกแรกจาก สิ้นสุดเมื่อสกปรก == เท็จหรือจำนวนการข้ามผ่าน == 10 ในกรณีหลังข้อผิดพลาด "การทำซ้ำ 10 $ Digest () ถึงแล้ว" จะถูกบันทึก$rootScope
$digest
initWatchVal
$digest
watch.get(scope)
watch.last
watch.last
$digest
dirty
true
dirty == true
$digest
$rootScope
$digest
ตอนนี้เกี่ยวกับngRepeat
. สำหรับการwatch.get
เรียกแต่ละครั้งจะเก็บอ็อบเจ็กต์จากคอลเล็กชัน (ส่งคืนค่าของgetEntities
) พร้อมข้อมูลเพิ่มเติมในแคช ( HashQueueMap
โดยhashKey
) สำหรับการwatch.get
โทรทุกครั้งngRepeat
พยายามรับวัตถุhashKey
จากแคช ถ้ามันไม่ได้อยู่ในแคชngRepeat
เก็บไว้ในแคชสร้างขอบเขตใหม่ทำให้วัตถุที่มันสร้างองค์ประกอบ DOM, ฯลฯ
ตอนนี้เกี่ยวกับhashKey
. มักจะเป็นหมายเลขที่ไม่ซ้ำกันสร้างขึ้นโดยhashKey
nextUid()
แต่ก็สามารถใช้งานได้ hashKey
ถูกเก็บไว้ในวัตถุหลังจากสร้างขึ้นเพื่อใช้ในอนาคต
เหตุใดตัวอย่างของคุณจึงสร้างข้อผิดพลาด : ฟังก์ชันgetEntities()
จะส่งคืนอาร์เรย์ด้วยวัตถุใหม่เสมอ วัตถุนี้ไม่มีhashKey
และไม่มีอยู่ในngRepeat
แคช ดังนั้นngRepeat
ในแต่ละสร้างขอบเขตใหม่ได้กับนาฬิกาใหม่สำหรับwatch.get
{{entity.id}}
นาฬิกานี้ในครั้งแรกwatch.get
มีwatch.last == initWatchVal
. watch.get() != watch.last
ดังนั้น ดังนั้น$digest
เริ่มการสำรวจใหม่ ดังนั้นngRepeat
สร้างขอบเขตใหม่ด้วยนาฬิกาใหม่ ดังนั้น ... หลังจากผ่านไป 10 ครั้งคุณจะได้รับข้อผิดพลาด
คุณจะแก้ไขได้อย่างไร
- อย่าสร้างวัตถุใหม่ทุกครั้งที่
getEntities()
โทร
- หากคุณต้องการสร้างวัตถุใหม่คุณสามารถเพิ่ม
hashKey
วิธีการสำหรับวัตถุเหล่านั้นได้ ดูหัวข้อนี้สำหรับตัวอย่าง
หวังว่าคนที่รู้ภายใน AngularJS จะแก้ไขฉันได้ถ้าฉันทำอะไรผิด