【问题标题】:Implementing a cycle tag in Handlebars.js在 Handlebars.js 中实现循环标签
【发布时间】:2012-03-01 23:47:11
【问题描述】:

在 Django 中有一个模板标签叫做循环:https://docs.djangoproject.com/en/2.2/ref/templates/builtins/#cycle

一个例子:

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

输出:

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

您如何在 Handlebars.js 中实现此类功能?

【问题讨论】:

  • 我不确定是否可以通过这种方式扩展 Handlebars.js。你愿意接受替代的 js 模板引擎吗?

标签: javascript templates handlebars.js client-side-templating


【解决方案1】:

我在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}}

【讨论】:

    【解决方案2】:

    这是我想出的:

    Handlebars.registerHelper('cycle', function(value, block) {
      var values = value.split(' ');
      return values[block.data.index % (values.length + 1)];
    });
    
    {{#each users}}
      <tr class="{{cycle 'alternate'}}">
      <tr class="{{cycle 'odd even'}}">
    {{/each}} 
    

    【讨论】:

    • 我必须从(values.length + 1) 中删除+ 1,以使其正常工作。它选择了一个空字符串作为数组末尾的值。
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 2014-02-15
    相关资源
    最近更新 更多