2017-04-07 47 views
1

嵌套顶层每个鉴于这种背景下车把

{ 
    letters: ['a', 'b', 'c'], 
    numbers: ['1', '2', '3'] 
} 

我怎么会产生

a1 
a2 
a3 
b1 
b2 
b3 
c1 
c2 
c3 

从本质上说,

{{#each letters}} 
{{#each ../numbers}} 
what to put here? 
{{/each}} 
{{/each}} 

我特别使用https://github.com/sunng87/handlebars-rust,然而这在理论上已经非常接近功能奇偶性,所以在handlebars.js中应该如何兼容。

作为参考,我的实际用例是C++代码生成。这个问题主要是关于访问这个内部循环的this。现在我的代码看起来像

{{#each variant}} 
{{#each ../typearg}}{{#if @first}}template <{{/if}}{{this}}{{#if @last}}>{{else}},{{/if}}{{/each}} 
{{/each}} 

但是出于某种原因,这个输出

template <> 
template <> 

时,我期待它输出

template <T> 
template <T> 

的对象是相关的,被传递到它的形式是

{ 
    typearg: [ 'T' ], 
    variant: [{ }, { }] 
} 
+1

看起来像一个嵌套的'#each'循环,外面有'letters'就可以了。 –

+0

有没有办法做到维持嵌套构造? –

+0

请将'handlebars-rust'添加为标签,尤其是在您根据此问题创建错误报告时。 –

回答

1

我认为最好的出路是创建一个新的车把帮手,它会返回你html

Handlebars.registerHelper('multi_list', function(context, options) { 
    var html = ""; 
    var letters = options.hash.letters; 
    var numbers = options.hash.numbers; 

    for (var i=0; i< letters.length; i++) { 
    for (var j=0; j < numbers.length; j++) { 
     html += '<li>' + (letters[i] + '' + numbers[i] + '</li>'; 
    } 
    } 

    return html; 
}); 

而且你会叫助手

{{#multi_list letters numbers}}

如果你想仍然重复使用现有的each帮手,那么你可以使用 {{this}}{{./this}}访问内部循环的价值和

{{../this}}访问高一级的最外层循环值

{{#each variant}} 
    {{#each ../typearg}} 
     {{#if @first}} 
      template < 
     {{/if}} 
      {{this}} 
     {{#if @last}} 
      > 
     {{else}} 
      , 
     {{/if}} 
    {{/each}} 

     {{../this}} 

{{/each}} 
+0

我已经将我的实际用例添加到OP中,这是C++代码生成。在嵌套循环中,我有更多的模板在现实中完成,而不是简单地输出字母 –

+0

如果是这种情况,您可以将所有逻辑移动到帮助器中。你可以在助手中写出JS中的任何复杂的逻辑。从HTML中抽象出复杂性总是更好。这是手柄中帮助者的主要原因。 –

+0

我假设访问嵌套循环内的值是一个tepmlating语言的基本功能。否则,在支持嵌套循环方面几乎没有什么价值 –