Http://docs.angularjs.org/error/$rootScope:inprog देखें
समस्या तब उत्पन्न होती है जब आपके पास कॉल होता $apply
है जो कभी-कभी कोणीय कोड के बाहर अतुल्यकालिक रूप से चलाया जाता है (जब $ लागू का उपयोग किया जाना चाहिए) और कभी-कभी तुल्यकालिक रूप से कोणीय कोड के अंदर होता है (जो $digest already in progress
त्रुटि का कारण बनता है )।
यह तब हो सकता है, उदाहरण के लिए, जब आपके पास एक पुस्तकालय होता है जो अतुल्यकालिक रूप से एक सर्वर से आइटम प्राप्त करता है और उन्हें कैश करता है। पहली बार किसी आइटम का अनुरोध किया गया है, इसे असिंक्रोनस रूप से पुनर्प्राप्त किया जाएगा ताकि कोड निष्पादन को अवरुद्ध न किया जा सके। हालांकि, दूसरी बार, आइटम पहले से ही कैश में है इसलिए इसे सिंक्रोनाइज़ किया जा सकता है।
इस त्रुटि को रोकने का तरीका यह सुनिश्चित करना है कि कॉल करने वाला कोड $apply
एसिंक्रोनस रूप से चलाया जाता है। यह एक कॉल के अंदर अपना कोड चलाकर $timeout
देरी सेट 0
(जो डिफ़ॉल्ट है) के साथ किया जा सकता है । हालांकि, अपने कोड $timeout
को कॉल करने से कॉल करने की आवश्यकता को हटा दिया जाता है $apply
, क्योंकि $ टाइमआउट एक और $digest
चक्र को अपने दम पर ट्रिगर करेगा , जो बदले में, सभी आवश्यक अपडेटिंग करेगा, आदि।
समाधान
संक्षेप में, ऐसा करने के बजाय:
... your controller code...
$http.get('some/url', function(data){
$scope.$apply(function(){
$scope.mydate = data.mydata;
});
});
... more of your controller code...
यह करो:
... your controller code...
$http.get('some/url', function(data){
$timeout(function(){
$scope.mydate = data.mydata;
});
});
... more of your controller code...
केवल तभी कॉल करें $apply
जब आप जानते हैं कि यह कोड चलने वाला कोड हमेशा कोणीय कोड के बाहर चलाया जाएगा (जैसे कि आपकी कॉल $ अप्लाई एक कॉलबैक के अंदर होगी जिसे आपके कोणीय कोड के बाहर कोड कहा जाता है)।
जब तक किसी व्यक्ति को $timeout
ओवर इस्तमाल करने के कुछ प्रभावशाली नुकसान के बारे में पता $apply
नहीं होता है , मैं यह नहीं देखता कि आप $timeout
इसके बजाय हमेशा (शून्य विलंब के साथ) का उपयोग क्यों नहीं कर सकते $apply
, क्योंकि यह लगभग एक ही काम करेगा।