คำตอบสั้น ๆ : คุณต้องการฟังก์ชั่นดังกล่าวจริงๆหรือคุณสามารถใช้คุณสมบัติได้? http://jsfiddle.net/awnqm/1/
คำตอบยาว
เพื่อความง่ายฉันจะอธิบายเฉพาะกรณีของคุณ - ngRepeat สำหรับอาร์เรย์ของวัตถุ นอกจากนี้ฉันจะไม่ใส่รายละเอียดบางอย่าง
AngularJS ใช้การตรวจสอบสกปรกเพื่อตรวจจับการเปลี่ยนแปลง เมื่อโปรแกรมประยุกต์จะเริ่มต้นมันจะทำงานสำหรับ$digest จะทำข้ามความลึกเป็นครั้งแรกสำหรับลำดับชั้นขอบเขตของ ขอบเขตทั้งหมดมีรายการนาฬิกา นาฬิกาแต่ละเรือนมีค่าสุดท้าย (เริ่มแรก) สำหรับขอบเขตสำหรับนาฬิกาทุกแต่ละมันวิ่งได้รับค่าปัจจุบัน ( ) และเปรียบเทียบกับ ถ้าค่าปัจจุบันไม่เท่ากับ(เสมอแรกเปรียบเทียบ) ชุดที่จะ เมื่อขอบเขตทั้งหมดจะถูกประมวลผลถ้าจะเริ่มต้นอีก traversal ลึกแรกจาก สิ้นสุดเมื่อสกปรก == เท็จหรือจำนวนการข้ามผ่าน == 10 ในกรณีหลังข้อผิดพลาด "การทำซ้ำ 10 $ Digest () ถึงแล้ว" จะถูกบันทึก$rootScope$digestinitWatchVal$digestwatch.get(scope)watch.lastwatch.last$digestdirtytruedirty == 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 จะแก้ไขฉันได้ถ้าฉันทำอะไรผิด