2012-08-12 13 views

Odpowiedz

141

Do tego nie ma nic w Handlebars, ale można łatwo dodać własnych pomocników.

Jeśli po prostu chciał zrobić coś n razy następnie:

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

i

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

Jeśli chciałeś cały for(;;) pętlę, to coś takiego:

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

i

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

Demo: http://jsfiddle.net/ambiguous/WNbrL/

+1

+1 dla pomocników. Na marginesie zagnieżdżanie helpera nie działa w scenariuszach, w których trzeba odnieść się do początkowych danych. tj. dane: {wiersze: 12, cols: 3}. – backdesk

+0

@ mu-is-too-short help tu? http://stackoverflow.com/questions/28865379/handlebar-helper-syntax-in-ember-cli – sheriffderek

+0

@sheriffderek Przepraszam, nie znam strony Ember ani Ember-CLI. –

7

Jeśli lubisz coffeescript

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

i

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

Ten fragment zajmie innego bloku w przypadku n pochodzi wartość jako dynamiczne i zapewniają @index opcjonalna zmienna kontekstowa, zachowa także zewnętrzny kontekst wykonania.

/* 
* 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

Podoba mi się to podejście lepiej, ponieważ masz pod ręką zmienną @index. Możesz także łatwo dodawać inne zmienne w zależności od konkretnych potrzeb. – ChrisRich

10

Najlepsza odpowiedź tutaj jest dobra, jeśli chcesz używać ostatni/pierwszy/indeks chociaż można użyć następujących

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; 
}); 

i

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

Ten helper wydaje się nie zezwalać na używanie @ ../index lub @ ../last, kiedy przychodzi do zagnieżdżonych zastosowań helpera. Czy to prawda, czy może zrobiłem coś złego? – madtyn

Powiązane problemy