Displaying a List of Items Edit Page


To iterate over a list of items, use the {{#each}} helper. The first argument to this helper is the array to be iterated, and the value being iterated is yielded as a block param. Block params are only available inside the block of their helper.

For example, this template iterates an array named people that contains objects. Each item in the array is provided as the block param person.

1
2
3
4
5
<ul>
  {{#each people as |person|}}
    <li>Hello, {{person.name}}!</li>
  {{/each}}
</ul>

Block params, like function arguments in JavaScript, are positional. person is what each item is named in the above template, but human would work just as well.

The template inside of the {{#each}} block will be repeated once for each item in the array, with the each item set to the person block param.

Given an input array like:

1
2
3
[ { name: 'Yehuda' },
  { name: 'Tom' },
  { name: 'Trek' } ]

The above template will render HTML like this:

1
2
3
4
5
<ul>
  <li>Hello, Yehuda!</li>
  <li>Hello, Tom!</li>
  <li>Hello, Trek!</li>
</ul>

Like other helpers, the {{#each}} helper is bound. If a new item is added to or removed from the iterated array, the DOM will be updated without having to write any additional code. That said, Ember requires that you use special methods to update bound arrays. Also be aware that using the key option with an each helper can improve re-render performance when an array is replaced with another containing similar items.

Accessing an item's index

During iteration, the index of each item in the array is provided as a second block param. Block params are space-separated, without commas. For example:

1
2
3
4
5
<ul>
  {{#each people as |person index|}}
    <li>Hello, {{person.name}}! You're number {{index}} in line</li>
  {{/each}}
</ul>

Empty Lists

The {{#each}} helper can have a corresponding {{else}}. The contents of this block will render if the array passed to {{#each}} is empty:

1
2
3
4
5
{{#each people as |person|}}
  Hello, {{person.name}}!
{{else}}
  Sorry, nobody is here.
{{/each}}