2017-04-07 65 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語言的基本功能。否則,在支持嵌套循環方面幾乎沒有什麼價值 –