संक्षिप्त उत्तर : क्या आपको वास्तव में ऐसे फ़ंक्शन की आवश्यकता है या आप संपत्ति का उपयोग कर सकते हैं? http://jsfiddle.net/awnqm/1/
लंबा जवाब
सादगी के लिए मैं केवल आपके मामले का वर्णन करूंगा - वस्तुओं की सरणी के लिए ngRepeat। इसके अलावा, मैं कुछ विवरण छोड़ दूँगा।
AngularJS परिवर्तनों का पता लगाने के लिए गंदी जाँच का उपयोग करता है । जब आवेदन शुरू किया जाता है तो यह उसके लिए चलता $digestहै $rootScope। गुंजाइश की पदानुक्रम के$digest लिए गहराई-पहला ट्रैवर्सल करेंगे । सभी स्कोप में घड़ियों की सूची है। प्रत्येक घड़ी का अंतिम मूल्य (शुरू में ) होता है। सभी घड़ियों के लिए प्रत्येक गुंजाइश के लिए इसे चलाता है, वर्तमान मूल्य प्राप्त करता है ( ) और इसकी तुलना करता है । के बराबर हैं वर्तमान मूल्य नहीं है (पहले की तुलना हमेशा के लिए) सेट करने के लिए । जब सभी स्कोप को संसाधित किया जाता है यदि एक और गहराई-पहले ट्रैवर्सल शुरू होता है । समाप्त होता है जब गंदे == गलत या ट्रैवर्सल्स की संख्या == 10. बाद के मामले में, त्रुटि "10 $ डाइजेस्ट ()) तक पहुंच गई।" लॉग इन किया जाएगा।initWatchVal$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 के इंटर्नल को जानते हैं वे मुझे सही करेंगे अगर मैं किसी चीज में गलत हूं।