# `ngRepeat` (directive in module `ng` )

Improve this doc

## Description

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:

- `$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.

Additionally, you can also provide animations via the ngAnimate attribute to animate the enter, leave and move effects.

## Usage

as attribute

    <ANY ng-repeat="{repeat_expression}">
       ...
    </ANY>

as class

    <ANY class="ng-repeat: {repeat_expression};">
       ...
    </ANY>

with animations

    //The enter, leave and move animations are supported
    <ANY ng-repeat="{repeat_expression}" ng-animate="{enter: 'enter-animation', leave: 'leave-animation', move: 'move-animation'}">
       ...
    </ANY>

Click here to learn more about the steps involved in the animation.

### Directive info

- This directive creates new scope.
- This directive executes at priority level 1000.

### Parameters

- `ngRepeat – {repeat_expression} –`

  The expression indicating how to enumerate a collection. These formats are currently supported:

  - `variable in expression` – where variable is the user defined loop variable and `expression` is a scope expression giving the collection to enumerate.

    For example: `track in cd.tracks`.

  - `(key, value) in expression` – where `key` and `value` can be any user defined identifiers, and `expression` is the scope expression giving the collection to enumerate.

    For example: `(name, age) in {'adam':10, 'amalie':12}`.

  - `variable in expression track by tracking_expression` – You can also provide an optional tracking function which can be used to associate the objects in the collection with the DOM elements. If no tractking function is specified the ng-repeat associates elements by identity in the collection. It is an error to have more then one tractking function to resolve to the same key. (This would mean that two distinct objects are mapped to the same DOM element, which is not possible.)

    For example: `item in items` is equivalent to `item in items track by $id(item)'. This implies that the DOM elements will be associated by item identity in the array.

    For example: `item in items track by $id(item)`. A built in `$id()` function can be used to assign a unique `$$hashKey` property to each item in the array. This property is then used as a key to associated DOM elements with the corresponding item in the array by identity. Moving the same object in array would move the DOM element in the same way ian the DOM.

    For example: `item in items track by item.id` Is a typical pattern when the items come from the database. In this case the object identity does not matter. Two objects are considered equivalent as long as their `id` property is same.

### Animations

- 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

## Example

This example initializes the scope to a list of names and then uses `ngRepeat` to display every person:

#### Source

#### Demo