6

I am getting a compilation error in ember-cli whenever I have a Handelbars template that uses @vars variables (i.e., @index, @key, @first, @last) inside of the each helper. (See http://handlebarsjs.com/#iteration for documentation on these @vars variables inside the each helper.) Below is a simple application built using ember-cli and containing only two files added to the program: routes/application.js and templates/application.hbs. At the bottom of this post is a screenshot of the compilation error message given by ember-cli. Is there an error in my code? Or is this a bug I should report on github @ https://github.com/stefanpenner/ember-cli?

routes/application.js

export default Ember.Route.extend({
    model: function() {
        return ['red', 'blue', 'green'];
    }
});

templates/application.hbs

{{#each model}}
  {{@index}}: {{this}}
{{/each}}

Screenshot of ember-cli compilation error message: Screenshot of ember-cli compilation error message

Here are the versions of the various tools involved:

  • ember-cli: 0.0.40
  • node: 0.10.30
  • npm: 1.4.21
  • Handlebars: 1.3.0
  • Ember: 1.6.1
jake
  • 1,929
  • 3
  • 23
  • 31

2 Answers2

4

That really isn't related to ember-cli. Ember Handlebars doesn't support the @keyword items.

Kingpin2k
  • 47,277
  • 10
  • 78
  • 96
  • 2
    Thanks, that was news to me. Your comment helped lead me to this related article: http://mozmonkey.com/2014/03/ember-getting-the-index-in-each-loops/ – jake Aug 20 '14 at 04:19
4

It's possible to mimic behavior of following Handlebars keywords: @index, @key, @first, @last.

@index

{{#each array as |item index|}}
  Index of item: `{{item}}` is: `{{index}}`
{{/each}}

@key

{{#each-in object as |key value|}}
  {{key}}: {{value}}
{{/each-in}}

@first

You could also mimic behavior of @first using ember-truth-helpers addon and taking advantage of eq helper - thanks to kristjan reinhold for this idea:

{{#each array as |item index|}}
  {{#if (eq index 0)}}
    <!-- first element specific html -->
  {{else}}
    <!-- other html -->
  {{/if}}
{{/each}}

Instead of (eq index 0) you can use (eq item array.firstObject).

@last

As dwickern suggested you can use Ember.Array.lastObject to mimic @last behavior.

{{#each array as |item|}}
  {{#if (eq item array.lastObject)}}
    <!-- last element specific html -->
  {{else}}
    <!-- other html -->
  {{/if}}
{{/each}}
Daniel Kmak
  • 18,164
  • 7
  • 66
  • 89