29

我写了一个显示推文的小插件。以下是循环和显示推文的代码。

    <script id="tweets-template" type="text/x-handlebars-template" >
        {{#each this}}
        <li>
        <p>{{tweet}}</p>
            <span id="author">{{author}}<span/>
        </li>
        {{/each}}
    </script>

但我想做的是将推文的数量限制为 5 或 10。但循环列出了所有可用的推文。如何限制 for 循环中的推文。像

    for(i=0;i<5;i++){display the tweets}
4

4 回答 4

42

我认为你有两个选择:

  1. 在将集合交给 Handlebars 之前限制集合的大小。
  2. 编写您自己的块助手,让您指定一个限制。

实际的each实现非常简单,因此调整它以包含上限非常简单:

// Warning: untested code
Handlebars.registerHelper('each_upto', function(ary, max, options) {
    if(!ary || ary.length == 0)
        return options.inverse(this);

    var result = [ ];
    for(var i = 0; i < max && i < ary.length; ++i)
        result.push(options.fn(ary[i]));
    return result.join('');
});

然后在您的模板中:

<script id="tweets-template" type="text/x-handlebars-template" >
    {{#each_upto this 5}}
        <li>
            <p>{{tweet}}</p>
            <span id="author">{{author}}<span/>
        </li>
    {{/each_upto}}
</script>
于 2012-04-30T02:28:36.140 回答
26

正如Dtipson所说,我同意复制each目前不是一个好主意。

他提出的使用limit助手的方法确实是 IMO 的最佳方法,这里是实现它所需的代码:

// limit an array to a maximum of elements (from the start)
Handlebars.registerHelper('limit', function (arr, limit) {
  if (!Array.isArray(arr)) { return []; }
  return arr.slice(0, limit);
});

然后在你的模板中(假设你的数组是cart.products):

{{#each (limit cart.products 5)}}
  <li>Index is {{@index}} - element is {{this}}</li>
{{/each}}

当然,您需要一个支持子表达式的最新车把版本才能正常工作。

于 2015-04-27T07:30:41.247 回答
4

“每个”不再很简单:https ://github.com/wycats/handlebars.js/blob/master/lib/handlebars/base.js#L99

那是因为每个现在都支持您可能仍然希望访问的大量循环信息。

因此,如果您不想重新实现更复杂的数据,那么尽早限制数据可能更可取。如果您使用的是最新版本的车把,您也可以尝试在每个中使用子表达式(即 {{#each (limit data 6)}})。

于 2014-02-24T16:27:59.677 回答
-1

只需查看该{{@index}}值并将其包装在一个{{#if}}块中即可。如果索引大于某个数字,则不呈现标记。

var collection = { ... tweets ... }

{{#each collection}}
    {{#if @index < 5}}
        <tweet markup>
    {{/if}}
{{/each}}
于 2015-12-13T17:41:15.627 回答