Improve this Doc View Source ngRepeat
- directive in module ng
The ngRepeat
directive instantiates a template once per item from a collection. Each template instance gets its own scope, where the given loop variable is set to the current collection item, and $index
is set to the item index or key.
Special properties are exposed on the local scope of each template instance, including:
Variable | Type | Details |
---|---|---|
$index | number | iterator offset of the repeated element (0..length-1) |
$first | boolean | true if the repeated element is first in the iterator. |
$middle | boolean | true if the repeated element is between the first and last in the iterator. |
$last | boolean | true if the repeated element is last in the iterator. |
$even | boolean | true if the iterator position $index is even (otherwise false). |
$odd | boolean | true if the iterator position $index is odd (otherwise false). |
ngInit
. This may be useful when, for instance, nesting ngRepeats. Iterating over object properties
It is possible to get ngRepeat
to iterate over the properties of an object using the following syntax:
<div ng-repeat="(key, value) in myObj"> ... </div>
However, there are a few limitations compared to array iteration:
-
The JavaScript specification does not define the order of keys returned for an object, so Angular relies on the order returned by the browser when running
for key in myObj
. Browsers generally follow the strategy of providing keys in the order in which they were defined, although there are exceptions when keys are deleted and reinstated. See the MDN page ondelete
for more info. -
ngRepeat
will silently ignore object keys starting with$
, because it's a prefix used by Angular for public ($
) and private ($$
) properties. -
The built-in filters orderBy and filter do not work with objects, and will throw an error if used with one.
If you are hitting any of these limitations, the recommended workaround is to convert your object into an array that is sorted into the order that you prefer before providing it to ngRepeat
. You could do this with a filter such as toArrayFilter or implement a $watch
on the object yourself.
Tracking and Duplicates
ngRepeat
uses $watchCollection to detect changes in the collection. When a change happens, ngRepeat
then makes the corresponding changes to the DOM:
- When an item is added, a new instance of the template is added to the DOM.
- When an item is removed, its template instance is removed from the DOM.
- When items are reordered, their respective templates are reordered in the DOM.
To minimize creation of DOM elements, ngRepeat
uses a function to "keep track" of all items in the collection and their corresponding DOM elements. For example, if an item is added to the collection, ngRepeat
will know that all other items already have DOM elements, and will not re-render them.
The default tracking function (which tracks items by their identity) does not allow duplicate items in arrays. This is because when there are duplicates, it is not possible to maintain a one-to-one mapping between collection items and DOM elements.
If you do need to repeat duplicate items, you can substitute the default tracking behavior with your own using the track by
expression.
For example, you may track items by the index of each item in the collection, using the special scope property $index
:
<div ng-repeat="n in [42, 42, 43, 43] track by $index"> {{n}} </div>
You may also use arbitrary expressions in track by
, including references to custom functions on the scope:
<div ng-repeat="n in [42, 42, 43, 43] track by myTrackingFunction(n)"> {{n}} </div>
ngRepeat
will not have to rebuild the DOM elements for items it has already rendered, even if the JavaScript objects in the collection have been substituted for new ones. For large collections, this significantly improves rendering performance. If you don't have a unique identifier, track by $index
can also provide a performance boost. <div ng-repeat="model in collection track by model.id"> {{model.name}} </div>
track by $index
when the repeated template contains one-time bindings. In such cases, the nth
DOM element will always be matched with the nth
item of the array, so the bindings on that element will not be updated even when the corresponding item changes, essentially causing the view to get out-of-sync with the underlying data. When no track by
expression is provided, it is equivalent to tracking by the built-in $id
function, which tracks items by their identity:
<div ng-repeat="obj in collection track by $id(obj)"> {{obj.prop}} </div>
track by
must always be the last expression: <div ng-repeat="model in collection | orderBy: 'id' as filtered_result track by model.id"> {{model.name}} </div>
Special repeat start and end points
To repeat a series of elements instead of just one parent element, ngRepeat (as well as other ng directives) supports extending the range of the repeater by defining explicit start and end points by using ng-repeat-start and ng-repeat-end respectively. The ng-repeat-start directive works the same as ng-repeat, but will repeat all the HTML code (including the tag it's defined on) up to and including the ending HTML tag where ng-repeat-end is placed.
The example below makes use of this feature:
<header ng-repeat-start="item in items"> Header {{ item }} </header> <div class="body"> Body {{ item }} </div> <footer ng-repeat-end> Footer {{ item }} </footer>
And with an input of ['A','B']
for the items variable in the example above, the output will evaluate to:
<header> Header A </header> <div class="body"> Body A </div> <footer> Footer A </footer> <header> Header B </header> <div class="body"> Body B </div> <footer> Footer B </footer>
The custom start and end points for ngRepeat also support all other HTML directive syntax flavors provided in AngularJS (such as data-ng-repeat-start, x-ng-repeat-start and ng:repeat-start).
Directive Info
- This directive creates new scope.
- This directive executes at priority level 1000.
- This directive can be used as multiElement
Usage
- as element: (This directive can be used as custom element, but be aware of IE restrictions).
<ng-repeat ng-repeat="repeat_expression"> ... </ng-repeat>
- as attribute:
<ANY ng-repeat="repeat_expression"> ... </ANY>
Animations
Animation | Occurs |
---|---|
enter | when a new item is added to the list or when an item is revealed after a filter |
leave | when an item is removed from the list or when an item is filtered out |
move | when an adjacent item is filtered out causing a reorder or when the item contents are reordered |
See the example below for defining CSS animations with ngRepeat.
Click here to learn more about the steps involved in the animation.Arguments
Param | Type | Details |
---|---|---|
ngRepeat | repeat_expression | The expression indicating how to enumerate a collection. These formats are currently supported:
|
This example uses ngRepeat
to display a list of people. A filter is used to restrict the displayed results by name or by age. New (entering) and removed (leaving) items are animated.
© 2010–2017 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
https://code.angularjs.org/1.5.11/docs/api/ng/directive/ngRepeat