त्रुटि: 10 $ डाइजेस्ट () पुनरावृत्तियों पर पहुंच गया। निरस्त किया जा रहा! गतिशील छंटनी के साथ विधेय


134

मेरे पास निम्न कोड है जो उपयोगकर्ता और उसके स्कोर के नाम को दोहराता है और प्रदर्शित करता है:

<div ng-controller="AngularCtrl" ng-app>
  <div ng-repeat="user in users | orderBy:predicate:reverse | limitTo:10">
    <div ng-init="user.score=user.id+1">
        {{user.name}} and {{user.score}}
    </div>
  </div>
</div>

और इसी कोणीय नियंत्रक।

function AngularCtrl($scope) {
    $scope.predicate = 'score';
    $scope.reverse = true;
    $scope.users = [{id: 1, name: 'John'}, {id: 2, name: 'Ken'}, {id: 3, name: 'smith'}, {id: 4, name: 'kevin'}, {id: 5, name: 'bob'}, {id: 6, name: 'Dev'}, {id: 7, name: 'Joe'}, {id: 8, name: 'kevin'}, {id: 9, name: 'John'}, {id: 10, name: 'Ken'}, {id: 11, name: 'John'}, {id: 1, name: 'John'}, {id: 2, name: 'Ken'}, {id: 3, name: 'smith'}, {id: 4, name: 'kevin'}, {id: 5, name: 'bob'}, {id: 6, name: 'Dev'}, {id: 7, name: 'Joe'}, {id: 8, name: 'kevin'}, {id: 9, name: 'John'}, {id: 10, name: 'Ken'}]
}

जब मैं उपरोक्त कोड चलाता हूं, मुझे त्रुटि मिलती है : 10 $ डाइजेस्ट () पुनरावृत्तियों पर पहुंच गया। निरस्त किया जा रहा! मेरे कंसोल में त्रुटि।

मैंने उसी के लिए jsfiddle बनाया है ।

सॉर्ट विधेय को केवल एनजी-रिपीट के अंदर शुरू किया जा रहा है और वस्तुओं की संख्या पर भी सीमा लागू की जा रही है। इसलिए मुझे लगता है कि दोनों एक साथ छंटनी और सीमा पर नजर रखने वाले त्रुटि का कारण है।

यदि $ गुंजाइश.reverse झूठी है (स्कोर का आरोही क्रम), तो यह त्रुटि नहीं करता है।

क्या कोई मुझे समझने में मदद कर सकता है कि यहां क्या गलत है? आपकी मदद की बहुत सराहना करते हैं।


यदि आप if स्टेटमेंट निकालते हैं, तो क्या यह अभी भी त्रुटि है?
मैथ्यू बर्ग

आपकी प्रतिक्रिया के लिए धन्यवाद मैथ्यू! मैंने समस्या का गलत निदान किया। समस्या छंटनी और सीमा के साथ लगती है। मैंने JSFiddle के साथ सवाल अपडेट किया है। आपकी मदद की बहुत सराहना करते हैं।
चॉबी बॉय

यह एक कोणीय बात है। आपको अपने कार्यों को याद करने और फिर याद रखने की आवश्यकता है। पर मेरा उत्तर पकड़ो stackoverflow.com/questions/14376879/...
जूलियो Marins

जवाबों:


116

कृपया इस jsFiddle को देखें । (कोड मूल रूप से वही है जिसे आपने पोस्ट किया था लेकिन मैं स्क्रॉल ईवेंट को बांधने के लिए विंडो के बजाय एक तत्व का उपयोग करता हूं)।

जहां तक ​​मैं देख सकता हूं, आपके द्वारा पोस्ट किए गए कोड के साथ कोई समस्या नहीं है। आपके द्वारा सामान्य रूप से उल्लिखित त्रुटि तब होती है जब आप किसी संपत्ति पर परिवर्तनों का एक लूप बनाते हैं। उदाहरण के लिए, जैसे जब आप किसी निश्चित संपत्ति पर परिवर्तन देखते हैं और फिर श्रोता पर उस संपत्ति के मूल्य को बदलते हैं:

$scope.$watch('users', function(value) {
  $scope.users = [];
});

यह एक त्रुटि संदेश पर परिणाम देगा:

अनकवर्ड एरर: 10 $ डाइजेस्ट () पुनरावृत्तियों तक पहुँच गया। निरस्त किया जा रहा!
पिछले 5 पुनरावृत्तियों में देखे गए दर्शक:

सुनिश्चित करें कि आपके कोड में इस तरह की स्थितियां नहीं हैं।

अपडेट करें:

ये तुम्हारी दिक्कत है:

<div ng-init="user.score=user.id+1"> 

आपको रेंडर के दौरान ऑब्जेक्ट्स / मॉडल नहीं बदलना चाहिए, अन्यथा यह एक नए रेंडर को बाध्य करेगा (और परिणामस्वरूप एक लूप , जो 'एरर: 10 $ डाइजेस्ट () पुनरावृत्तियों तक पहुँच जाता है। एबॉर्टिंग!' )।

यदि आप मॉडल को अद्यतन करना चाहते हैं, तो इसे नियंत्रक या किसी निर्देश पर करें, कभी भी दृश्य पर नहीं। AngularJS प्रलेखन का उपयोग नहीं करने की सिफारिश कीng-init वास्तव में स्थितियों के इन प्रकार से बचने के लिए:

टेम्प्लेट में ngInit निर्देश का उपयोग करें (केवल खिलौना / उदाहरण ऐप्स के लिए, वास्तविक अनुप्रयोगों के लिए अनुशंसित नहीं)

यहाँ एक jsFiddle एक काम कर उदाहरण के साथ है।


1
FYI करें, angular.element(w).bind()आप के बजाय उपयोग कर सकते हैं element.bind()
मार्क राजकोक

बहुत धन्यवाद bmleite और मार्क। मैंने समस्या का गलत निदान किया। कृपया मेरी टिप्पणियाँ ऊपर देखें। मैंने JSFiddle के साथ सवाल अपडेट किया है। आपकी मदद की बहुत सराहना करते हैं।
चॉबी बॉय

बहुत बहुत धन्यवाद @bmleite! बस और समझने की कोशिश कर रहा हूं। लेकिन ऐसा क्यों है कि यदि $ गुंजाइश.reverse = false (स्कोर के बढ़ते क्रम) में त्रुटि नहीं होती है?
च्यूबी बॉय

आरोही और अवरोही के लिए आपको उपसर्गों '+' और '-' का प्रयोग करना चाहिए, क्रमशः (यानी '+ स्कोर' और '-score')। इस पर अधिक जानकारी यहाँ
बामलेइट

1
इस जवाब ने मेरी समस्या हल कर दी। इस व्याख्या में अच्छा है कि यह समस्या का वर्णन करता है: $ डाइजेस्ट () पुनरावृत्तियों में त्रुटि होती है जब आप उसी समय एक संपत्ति को संशोधित करने का प्रयास करते हैं जब आप लूपिंग कर रहे होते हैं। इसलिए प्रत्येक संपत्ति परिवर्तन दृश्य (यूआई) के अद्यतन को ट्रिगर करता है और कोणीय अंततः 10 छोरों पर अधिकतम होता है। JsFiddle उदाहरण नियंत्रक में संपत्ति परिवर्तन डालता है। दृश्य में गुण बदलने से इस त्रुटि का परिणाम होता है।
mbokil

9

मेरे लिए इस त्रुटि का कारण था ...

ng-if="{{myTrustSrc(chat.src)}}"

मेरे खाके में

यह मेरे नियंत्रक में फ़ंक्शन myTrustSrc को अंतहीन लूप में कहा जाता है। अगर मैं इस लाइन से एनजी हटाता हूं, तो समस्या हल हो जाती है।

<iframe ng-if="chat.src" id='chat' name='chat' class='chat' ng-src="{{myTrustSrc(chat.src)}}"></iframe>

फ़ंक्शन को केवल कुछ ही बार कहा जाता है जब एनजी-अगर उपयोग नहीं किया जाता है। मुझे अब भी आश्चर्य है कि एनजी- src के साथ फ़ंक्शन को एक से अधिक बार क्यों कहा जाता है?

यह नियंत्रक में कार्य करता है

$scope.myTrustSrc = function(src) {
    return $sce.trustAsResourceUrl(src);
}

मुझे अब भी आश्चर्य है कि एनजी- src के साथ फ़ंक्शन को एक से अधिक बार क्यों कहा जाता है? - क्योंकि कोणीय HTML बनाने के लिए कुछ समय तक कोशिश करता है जब तक कि उसे 2 परिणाम नहीं मिलते जो समान हैं। 10 डॉलर के पचने () पुनरावृत्तियों तक पहुंचने में त्रुटि का अर्थ है, उन्होंने 10 बार कोशिश की और कभी भी 2 समान परिणाम नहीं मिले
bresleveloper

@bresleveloper क्या आप इस जानकारी के साथ लिंक प्रदान कर सकते हैं? धन्यवाद।
विल्ला

@Willa यहाँ देखें docs.angularjs.org/api/ng/type/$rootScope.Scope CTRF + F यह "अनन्त लूप गतिरोध को रोकने के लिए पुनर्मिलन पुनरावृत्ति सीमा 10 है"
Bresleveloper

धन्यवाद। इससे मदद मिली।
Willa

7

मेरे लिए यह था कि मैं एक निर्देशन के लिए 2-वे बाइंडिंग इनपुट '=' के रूप में एक फ़ंक्शन परिणाम पारित कर रहा था जो हर बार एक नई वस्तु बना रहा था।

तो मेरे पास कुछ ऐसा था:

<my-dir>
   <div ng-repeat="entity in entities">
      <some-other-dir entity="myDirCtrl.convertToSomeOtherObject(entity)"></some-other-dir>
   </div>
</my-dir>

और मेरी dir पर नियंत्रक विधि थी

this.convertToSomeOtherObject(entity) {
   var obj = new Object();
   obj.id = entity.Id;
   obj.value = entity.Value;
   [..]
   return obj;
}

जो जब मैंने बनाया

this.convertToSomeOtherObject(entity) {
   var converted = entity;
   converted.id = entity.Id;
   converted.value = entity.Value;
   [...]
   return converted;
}

समस्या का हल किया!

उम्मीद है कि यह किसी की मदद करेगा :)


5

मेरे पास इसका एक और उदाहरण है जो इसका कारण बना। उम्मीद है कि यह भविष्य के संदर्भ के लिए मदद करता है। मैं AngularJS 1.4.1 का उपयोग कर रहा हूं।

मेरे पास एक कस्टम निर्देश के लिए कई कॉल के साथ यह मार्कअप था:

<div ng-controller="SomeController">
    <myDirective data="myData.Where('IsOpen',true)"></myDirective>
    <myDirective data="myData.Where('IsOpen',false)"></myDirective>
</div>

myDataएक सरणी है और Where()एक एक्सटेंशन विधि है जो उस सरणी पर पुनरावृत्त करती है जो मूल से किसी भी आइटम को वापस करते हुए एक नया सरणी देता है जहां IsOpen संपत्ति दूसरे पैरामीटर में बूल मान से मेल खाती है।

नियंत्रक में मैं $scope.dataइस तरह सेट :

DataService.getData().then(function(results){
    $scope.data = results;
});

Where()उपरोक्त मार्कअप में निर्देश से विस्तार विधि को कॉल करना समस्या थी। इस समस्या को हल करने के लिए मैंने कॉल को मार्कअप के बजाय कंट्रोलर में एक्सटेंशन विधि में स्थानांतरित कर दिया:

<div ng-controller="SomeController">
    <myDirective data="openData"></myDirective>
    <myDirective data="closedData"></myDirective>
</div>

और नया नियंत्रक कोड:

DataService.getData().then(function(results){
    $scope.openData = results.Where('IsOpen',true);
    $scope.closedData = results.Where('IsOpen',false);
});

मुझे जो समस्या है, ठीक वही लगता है। एक साधारण फ़ंक्शन जो कुछ भी अपडेट नहीं करता था, लेकिन एक स्थानीय सरणी बनाता था, एक मौजूदा $ गुंजाइश सरणी पर पुनरावृत्त होता था, और स्थानीय सरणी में ऑब्जेक्ट बनाता था, और वापस लौटता था। एक बार कॉल करके और इसे $ स्कोप के सदस्य में संग्रहीत करके यह समस्या को हल करता है। धन्यवाद। काश मुझे पता होता कि सीधे तरीके का इस्तेमाल करने में क्या समस्या है।
एजिलेप्रो

2

पार्टी के लिए बहुत देर हो चुकी थी लेकिन मेरा मुद्दा बन रहा था क्योंकि कोणीय 1.5.8 में ui- राउटर का दोष है। उल्लेख करने के लिए एक बात यह है कि यह त्रुटि केवल पहली बार दिखाई दी जब मैं एप्लिकेशन चला रहा था और यह बाद में दोबारा नहीं होगा। गितुब के इस पोस्ट से मेरी समस्या हल हो गई। मूल रूप से त्रुटि शामिल है $urlRouterProvider.otherwise("/home") समाधान इस तरह एक समाधान था:

$urlRouterProvider.otherwise(function($injector, $location) {
   var $state = $injector.get("$state");
   $state.go("your-state-for-home");
});

2

शुरुआत के लिए आप $ घड़ी का उपयोग करने के लिए सभी उत्तरों को अनदेखा करें। कोणीय पहले से ही एक श्रोता से दूर काम करता है। मैं आपको गारंटी देता हूं कि आप केवल इस दिशा में सोचकर चीजों को जटिल कर रहे हैं।

उन सभी उत्तरों को अनदेखा करें जो आपको उपयोगकर्ता को $ टाइमआउट के बारे में बताते हैं। आप यह नहीं जान सकते कि पेज को लोड होने में कितना समय लगेगा, इसलिए यह सबसे अच्छा समाधान नहीं है।

आपको केवल यह जानना होगा कि पृष्ठ का प्रतिपादन कब किया गया है।

<div ng-app='myApp'>
<div ng-controller="testctrl">
    <label>{{total}}</label>
    <table>
      <tr ng-repeat="item in items track by $index;" ng-init="end($index);">
        <td>{{item.number}}</td>
      </tr>
    </table>
</div>

var app = angular.module('myApp', ["testctrl"]);
var controllers = angular.module("testctrl", []);
 controllers.controller("testctrl", function($scope) {

  $scope.items = [{"number":"one"},{"number":"two"},{"number":"three"}];

  $scope.end = function(index){
  if(index == $scope.items.length -1
        && typeof $scope.endThis == 'undefined'){

            ///  DO STUFF HERE
      $scope.total = index + 1;
      $scop.endThis  = true;
 }
}
});

एनजी-रिपीट को $ सूचकांक द्वारा ट्रैक करें और जब सरणी की लंबाई सूचकांक के बराबर हो जाए तो लूप को रोक दें और अपना तर्क दें।

jsfiddle


1

मुझे यह त्रुटि कोणीय वृक्ष नियंत्रण के संदर्भ में मिली। मेरे मामले में यह पेड़ के विकल्प थे। मैं एक समारोह से ट्रीओशन्स () लौट रहा था। यह हमेशा एक ही वस्तु को लौटा रहा था। लेकिन कोणीय जादुई रूप से सोचता है कि इसकी एक नई वस्तु और फिर एक पाचन चक्र को किक करने का कारण बनता है। जिससे पचाओं की पुनरावृत्ति होती है। समाधान यह था कि वृक्षों को दायरे में बांधा जाए। और इसे सिर्फ एक बार असाइन करें।


1

यह अजीब है ... मुझे एक ही त्रुटि मिली है, एक अलग चीज से आ रही है। जब मैं अपना नियंत्रक बनाता हूं तो मैंने $ लोकेशन पैरामीटर पारित किया है, जैसे:

App.controller('MessageController', function ($scope, $http, $log, $location, $attrs, MessageFactory, SocialMessageFactory) {
   // controller code
});

यह एक बग साबित हुआ जब हम थर्ड पार्टी लाइब्रेरी या प्योर जेएस का इस्तेमाल कुछ बारीकियों में फेरबदल करने के लिए करते हैं (यहाँ window.location) कोणीय का अगला पाचन इस त्रुटि को उड़ा देगा।

इसलिए मैंने बस नियंत्रक निर्माण पैरामीटर से $ स्थान को हटा दिया , और इस त्रुटि के बिना फिर से काम किया। या अगर आपको पूरी तरह से कोणीय से $ स्थान का उपयोग करने की आवश्यकता है, तो आपको <a href="#">link</a>अपने टेम्पलेट पृष्ठ के लिंक में हर एक को निकालना होगा , और href = "" लिखना होगा । मेरे लिए काम किया।

आशा है कि यह एक दिन मदद कर सकता है।


0

यदि आप कोणीय का उपयोग करते हैं तो अपने ब्राउज़र कंसोल से एनजी-स्टोरेज प्रोफाइल को हटा दें। यह एक सामान्य समाधान नहीं है बिट यह मेरे मामले में काम करता है।

Chrome F12-> संसाधन-> स्थानीय संग्रहण में


0

यह फ़ायरफ़ॉक्स को संस्करण 51 में अपग्रेड करने के ठीक बाद मेरे साथ हुआ। बाद में clearing the cache, समस्या चली गई।


0

मेरे पास समान त्रुटि थी, क्योंकि मैंने परिभाषित किया था

एनजी-वर्ग = "GetLink ()"

के बजाय

एनजी-क्लिक करें = "GetLink ()"


0

यह $ sce.trustAsResourceUrl () एनजी-src से बुलाए गए फ़ंक्शन के रिटर्न मान के रूप में उपयोग करते समय कोणीय 1.6 -> 1.7 से अपग्रेड करने के बाद मेरे साथ हुआ। आप इस मुद्दे को यहां देख सकते हैं ।

मेरे मामले में मुझे निम्नलिखित को बदलना पड़ा।

<source ng-src="{{trustSrc(someUrl)}}" type='video/mp4' />
trustSrc = function(url){
    return $sce.trustAsResourceUrl(url);
};

सेवा

<source ng-src='{{trustedUrl}} type='video/mp4' />
trustedUrl = $sce.trustAsResourceUrl(someUrl);

0

जब मुझे अपने कस्टम सॉर्ट-फ़िल्टर Array.reverse () में मुझे AngularJS 1.3.9 का उपयोग करके सटीक त्रुटि मिली थी

जब मैंने इसे हटाया, तो यह अच्छा हो गया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.