【问题标题】:Nested top level each in handlebars嵌套在车把中的顶层
【发布时间】:2017-09-03 05:28:15
【问题描述】:

鉴于这种情况

{
  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: [{ }, { }]
}

【问题讨论】:

  • 看起来像一个嵌套的#each 循环,外部带有letters,可以做到。
  • 有没有办法维护嵌套结构?
  • 请添加handlebars-rust 作为标签,尤其是在您基于此问题创建错误报告时。
  • 我为你添加了它,因为我不相信你有能力使用新标签来做到这一点

标签: javascript handlebars.js each


【解决方案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}}

【讨论】:

  • 我已将我的实际用例添加到 OP,即 C++ 代码生成。实际上,在嵌套循环中,我有更多的模板要做,而不是简单地输出字母
  • 如果是这种情况,您可以将所有逻辑移动到帮助程序内部。您可以在帮助程序内的 JS 中编写任何复杂的逻辑。从HTML 中抽象出复杂性总是更好。这就是车把中使用助手的主要原因。
  • 我会假设访问嵌套循环内的值对于模板化语言来说是相当基本的功能。否则根本没有支持嵌套循环的价值
  • @LucilleBlumire 如果您仍然想在HTML 方面做,我认为您可以这样做。要访问最内层循环的值,您可以执行{{this}} or {{./this}}。要访问最外层循环的值,您可以执行{{../this}}。完整的each 代码块是什么样子的?
  • 啊,在车把模拟器上尝试一下,看来我在车把锈中发现了一个错误,我要去打开一个问题,如果你想发布一个例子 { {this}} 和 {{../this}} 作为答案,我会将其标记为已接受,因为这正是我所寻找的
猜你喜欢
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多