2012-08-12 184 views
62

我是Handlebars.js的新手,剛開始使用它。大多數例子都是基於迭代一個對象的。我想知道如何在基本for循環中使用handlebars。使用Handlebars.js迭代基本「for」循環

例子。

for(i=0 ; i<100 ; i++) { 
    create li's with i as the value 
} 

這是如何實現的?

回答

141

Handlebars中沒有這個功能,但您可以輕鬆添加自己的助手。

如果你只是想做一些則n時間:

Handlebars.registerHelper('times', function(n, block) { 
    var accum = ''; 
    for(var i = 0; i < n; ++i) 
     accum += block.fn(i); 
    return accum; 
}); 

{{#times 10}} 
    <span>{{this}}</span> 
{{/times}} 

如果你想整個for(;;)循環,那麼這樣的事情:

Handlebars.registerHelper('for', function(from, to, incr, block) { 
    var accum = ''; 
    for(var i = from; i < to; i += incr) 
     accum += block.fn(i); 
    return accum; 
}); 

{{#for 0 10 2}} 
    <span>{{this}}</span> 
{{/for}} 

演示:http://jsfiddle.net/ambiguous/WNbrL/

+1

+1的幫手。作爲一個方面說明,在需要引用初始數據的場景中,嵌套助手不起作用。即數據:{行數:12,列數:3}。 – backdesk 2014-03-19 15:55:56

+0

@ mu-is-too-short對這裏有幫助嗎? http://stackoverflow.com/questions/28865379/handlebar-helper-syntax-in-ember-cli – sheriffderek 2015-03-04 21:30:14

+0

@sheriffderek對不起,我不知道東西的Ember或Ember-CLI方面。 – 2015-03-04 22:22:51

7

如果你喜歡的CoffeeScript

Handlebars.registerHelper "times", (n, block) -> 
    (block.fn(i) for i in [0...n]).join("") 

{{#times 10}} 
    <span>{{this}}</span> 
{{/times}} 
4

這個片段會照顧別人塊的情況下n當屬動態值,並提供@index可選的上下文變量,它也會保留執行的外部上下文。這裏

/* 
* Repeat given markup with given times 
* provides @index for the repeated iteraction 
*/ 
Handlebars.registerHelper("repeat", function (times, opts) { 
    var out = ""; 
    var i; 
    var data = {}; 

    if (times) { 
     for (i = 0; i < times; i += 1) { 
      data.index = i; 
      out += opts.fn(this, { 
       data: data 
      }); 
     } 
    } else { 

     out = opts.inverse(this); 
    } 

    return out; 
}); 
+0

我更喜歡這種方法,因爲您手邊有@index變量。您也可以根據具體需要輕鬆添加其他變量。 – ChrisRich 2016-01-29 10:15:27

10

頂部的回答是不錯的,如果你想用最後/第一/指數雖然你可以使用下面的

Handlebars.registerHelper('times', function(n, block) { 
    var accum = ''; 
    for(var i = 0; i < n; ++i) { 
     block.data.index = i; 
     block.data.first = i === 0; 
     block.data.last = i === (n - 1); 
     accum += block.fn(this); 
    } 
    return accum; 
}); 

{{#times 10}} 
    <span> {{@first}} {{@index}} {{@last}}</span> 
{{/times}} 
+0

這個幫助程序在嵌套使用Helper時似乎不允許使用@ ../index或@ ../last。這是正確的,或者我做錯了什麼? – madtyn 2017-06-13 10:43:55