Error: 10 $digest() Iterations received. Przerywam! z dynamicznym predykatem sortby

Mam następujący kod, który powtarza i wyświetla nazwę użytkownika i jego wynik:

<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>

I odpowiedni regulator kątowy.

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'}]
}

Kiedy uruchamiam powyższy kod, dostaję błąd : 10 $ digest() iteracji osiągniętych. Przerywam! błąd w mojej konsoli.

Stworzyłem jsfiddle dla tego samego.

Predykat sortowania jest inicjowany tylko wewnątrz ng-repeat, a także limit jest stosowany na liczbę obiektów. więc czuję, że posiadanie zarówno obserwatorów sortby, jak i limitTo jest powodem błędu.

If the $scope.odwrotność jest fałszywa (rosnąca kolejność partytury), wtedy nie jest błędna.

Czy ktoś może mi pomóc zrozumieć, co tu jest nie tak? Doceniam twoją pomoc.
Author: Prashant Pokhriyal, 2013-01-17

13 answers

Proszę sprawdzić to jsFiddle . (Kod jest w zasadzie taki sam, jak napisałeś, ale używam elementu zamiast okna, aby powiązać zdarzenia przewijania).

Z tego co widzę, nie ma problemu z kodem, który napisałeś. Błąd, o którym wspomniałeś, zwykle występuje podczas tworzenia pętli zmian nad właściwością. Na przykład, gdy obserwujesz zmiany na określonej właściwości, a następnie zmieniasz wartość tej właściwości na słuchaczu:

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

Spowoduje to komunikat o błędzie:

Uncaught Error: 10 $ digest() Iterations reached. Przerywam!
Obserwatorzy zwolniony w ostatnich 5 iteracjach: ...

Upewnij się, że Twój kod nie ma takich sytuacji.

Update:

To jest Twój problem:

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

Nie powinieneś zmieniać obiektów/modeli podczas renderowania lub w inny sposób, wymusi to nowy render (a w konsekwencji pętlę , co powoduje błąd : 10 $digest() iteracje dotarły. Przerywam!').

Jeśli chcesz zaktualizować model, zrób to na kontrolerze lub na dyrektywie, nigdy na widoku. angularjs documentation zaleca, aby nie używać ng-init dokładnie w celu uniknięcia tego typu sytuacji:

Użyj dyrektywy ngInit w szablonach (tylko dla zabawek/przykładowych aplikacji, nie zalecane do rzeczywistych zastosowań)

Oto jsFiddle z działającym przykładem.

 117
Author: bmleite,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-24 08:49:29

Przyczyną tego błędu było dla mnie...

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

W moim szablonie

Powoduje wywołanie funkcji myTrustSrc w moim kontrolerze w pętli nieskończonej. Jeśli usunę ng-if z tej linii, problem zostanie rozwiązany.

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

Funkcja jest wywoływana tylko kilka razy, gdy ng-if nie jest używane. Nadal zastanawiam się, dlaczego funkcja jest wywoływana więcej niż raz z ng-src?

Jest to funkcja w kontrolerze

$scope.myTrustSrc = function(src) {
    return $sce.trustAsResourceUrl(src);
}
 9
Author: Natus Drew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-06 15:57:35

Dla mnie chodziło o to, że przekazywałem wynik funkcji jako 2-way binding input '=' do dyrektywy, która za każdym razem tworzyła nowy obiekt.

Więc miałem coś takiego:

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

A metoda kontrolera w my-dir to

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

Które kiedy dotarłem do

this.convertToSomeOtherObject(entity) {
   var converted = entity;
   converted.id = entity.Id;
   converted.value = entity.Value;
   [...]
   return converted;
}
Rozwiązałem problem!

Mam nadzieję, że to komuś pomoże:)

 7
Author: Michail Michailidis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-23 17:47:08

Mam inny przykład czegoś, co to spowodowało. Mam nadzieję, że to pomoże w przyszłości. Używam AngularJS 1.4.1.

Miałem ten znacznik z wieloma wywołaniami do dyrektywy niestandardowej:

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

myData is an array and Where() is a extension method that iterates over the array returning a new array containing any items from the original where the isopen property match the bool value in the second parameter.

W kontrolerze ustawiłem $scope.data Jak to:

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

Wywołanie metody rozszerzenia Where() z dyrektywy tak jak w powyższym znaczniku było problemem. Aby rozwiązać ten problem przeniosłem wywołanie metody rozszerzenia do kontrolera zamiast znaczników:

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

I nowy kod kontrolera:

DataService.getData().then(function(results){
    $scope.openData = results.Where('IsOpen',true);
    $scope.closedData = results.Where('IsOpen',false);
});
 5
Author: squillman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-25 17:13:52

Dość późno na imprezę, ale mój problem pojawił się, ponieważ jest wada w Ui-routerze w angular 1.5.8. Należy wspomnieć, że ten błąd pojawił się dopiero po pierwszym uruchomieniu aplikacji i nie pojawi się ponownie później. Ten post z Githuba rozwiązał mój problem. Zasadniczo błąd dotyczy $urlRouterProvider.otherwise("/home") Rozwiązanie było obejściem takim jak to:

$urlRouterProvider.otherwise(function($injector, $location) {
   var $state = $injector.get("$state");
   $state.go("your-state-for-home");
});
 2
Author: Allen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-24 09:04:27

Na początek Ignoruj wszystkie odpowiedzi z powiedz, aby używać $ watch. Angular już działa od słuchacza. Gwarantuję ci, że komplikujesz sprawy tylko myśląc w tym kierunku.

Ignoruj wszystkie odpowiedzi, które mówią ci user $ timeout. Nie możesz wiedzieć, jak długo trwa ładowanie strony, dlatego nie jest to najlepsze rozwiązanie.

Musisz tylko wiedzieć, kiedy strona zostanie renderowana.

<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;
 }
}
});

Śledź ng-repeat przez $index i kiedy długość tablicy równa się indeksowi zatrzymaj pętlę i wykonaj swoją logikę.

Jsfiddle

 2
Author: Jed Lynch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-24 09:15:41

Dostałem ten błąd w kontekście angular tree control. W moim przypadku to były opcje drzewa. Zwracałem treeoptions () z funkcji. Zawsze zwracało ten sam przedmiot. Ale Angular magicznie myśli, że to nowy obiekt, a następnie spowodować cykl trawienia rozpocząć. Powoduje rekursję trawienia. Rozwiązaniem było Związanie drzewostanu z lunetą. I przypisać go tylko raz.

 1
Author: JDev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-06 18:52:51

To dziwne ... Mam dokładnie ten sam błąd, wynikający z innej rzeczy. Podczas tworzenia kontrolera przekazałem parametr $ location, TAK:

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

Udowodniono, że jest to błąd kiedy używamy bibliotek innych firm lub czystego JS manipulować niektóre specyfiki (tutaj okno.lokalizacja) następny straw kątowy będzie cios ten błąd.

Więc po prostu usunąłem $ location z parametru tworzenia kontrolera i działało ponownie, bez tego błąd. Lub jeśli koniecznie musisz użyć $location z angular, musisz usunąć wszystkie <a href="#">link</a> z linków na stronie szablonu, a raczej napisać href= "" . Dla mnie zadziałało.

Mam nadzieję, że kiedyś to pomoże.
 1
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-24 13:21:02

Jeśli używasz angular, Usuń profil ng-storage z konsoli przeglądarki. Nie jest to ogólne rozwiązanie, które zadziałało w moim przypadku.

W Chrome F12->Resources - > Local Storage

 0
Author: David Donari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-27 11:55:25

Przydarzyło mi się to zaraz po aktualizacji Firefoksa do wersji 51. Po clearing the cache problem zniknął.

 0
Author: Zsolti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-25 08:48:32

Miałem podobny błąd, ponieważ zdefiniowałem

Ng-class = "GetLink ()"

Zamiast

Ng-click= "GetLink ()"

 0
Author: Satish Kumar sonker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-11 10:07:53

Przydarzyło mi się to po aktualizacji z angular 1.6 -> 1.7 przy użyciu $sce.trustAsResourceUrl() jako wartość zwracana funkcji wywołanej z ng-src. Możesz zobaczyć ten problem tutaj .

W moim przypadku musiałem zmienić następujące.

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

Do

<source ng-src='{{trustedUrl}} type='video/mp4' />
trustedUrl = $sce.trustAsResourceUrl(someUrl);
 0
Author: aCMoFoCord,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-24 08:35:43

Otrzymałem dokładnie ten sam błąd przy użyciu AngularJS 1.3.9, gdy w moim niestandardowym filtrze wywołałem tablicę .rewers()

Po tym, jak go usunąłem, było dobrze.

 0
Author: michael hansen079,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-26 11:34:20