javascripttemplateshandlebars.jsclient-side-templating

Implementing a cycle tag in Handlebars.js


In Django there is a template tag called cycle: https://docs.djangoproject.com/en/2.2/ref/templates/builtins/#cycle

An example:

{% for o in some_list %}
    <tr class="{% cycle 'row1' 'row2' %}">
        ...
    </tr>
{% endfor %}

Output:

<tr class="row1">...</tr>
<tr class="row2">...</tr>
<tr class="row1">...</tr>
<tr class="row2">...</tr>

How do you implement this type of functionality in Handlebars.js?


Solution

  • I found at http://thinkvitamin.com/code/handlebars-js-part-2-partials-and-helpers/

    Handlebars.registerHelper("stripes", function(array, even, odd, fn) {
      if (array && array.length > 0) {
        var buffer = "";
        for (var i = 0, j = array.length; i < j; i++) {
          var item = array[i];
    
          // we'll just put the appropriate stripe class name onto the item for now
          item.stripeClass = (i % 2 == 0 ? even : odd);
    
          // show the inside of the block
          buffer += fn(item);
        }
    
        // return the finished buffer
        return buffer;
      }
    });
    
    
    {{#stripes myArray "even" "odd"}}
      <div class="{{stripeClass}}">
        ... code for the row ...
      </div>
    {{/stripes}}