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.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.
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);
}
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:)
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);
});
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");
});
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ę.
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.
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.
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.
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ął.
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 ()"
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);
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.
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