aboutsummaryrefslogtreecommitdiffstats
path: root/docs/content/error/$rootScope/infdig.ngdoc
blob: d6261df17d7e5e6dabe02cd1f921e40b885a75f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
@ngdoc error
@name $rootScope:infdig
@fullName Infinite $digest Loop
@description

This error occurs when the application's model becomes unstable and each `$digest` cycle triggers a state change and subsequent `$digest` cycle.
Angular detects this situation and prevents an infinite loop from causing the browser to become unresponsive.

For example, the situation can occur by setting up a watch on a path and subsequently updating the same path when the value changes.

```
$scope.$watch('foo', function() {
  $scope.foo = $scope.foo + 1;
});
```

One common mistake is binding to a function which generates a new array every time it is called.  For example:

```
<div ng-repeat="user in getUsers()">{{ user.name }}</div>

...

$scope.getUsers = function() {
  return [ { name: 'Hank' }, { name: 'Francisco' } ];
};
```

Since `getUsers()` returns a new array, Angular determines that the model is different on each `$digest`
cycle, resulting in the error.  The solution is to return the same array object if the elements have
not changed:

```
var users = [ { name: 'Hank' }, { name: 'Francisco' } ];

$scope.getUsers = function() {
  return users;
});
```

The maximum number of allowed iterations of the `$digest` cycle is controlled via TTL setting which can be configured via {@link ng.$rootScopeProvider $rootScopeProvider}.