1

使用 Handlebars 和 Node,我有一个长度不断变化的数组,每次它发生变化时我都需要获取它的最后一个元素之前的元素。

所以如果你想得到最后一个元素,你可以这样做:

{{#each array}}
  {{#if @last}}
    {{this}}
  {{/if}}
{{/each}}

它会返回最后一个元素。我有数学助手,可以执行基本的数学运算。例如,我可以得到所需的索引号

{{math array.length '-' 1}}

但我不能将它与另一个块助手一起使用,例如:

{{#each array}}
  {{#if math @last '-' 1}}
    {{this}}
  {{/if}}
{{/each}}

怎么可能做到这一点?谢谢你。

4

2 回答 2

2

首先,您声明您不能在块助手math的胡须内使用您的助手,例如. 这不是真的。Handlebars 支持子表达式#if{{#if math @last '-' 1}}

Handlebars 提供对子表达式的支持,它允许您在单个小胡子中调用多个助手,并将内部助手调用的结果作为参数传递给外部助手。子表达式由括号分隔。

但是,{{#if (math @last '-' 1)}}因为它是一个布尔值,所以没有多大意义@last,我建议不要1trueor中减去这种奇怪的东西false

如果您的问题是从数组中呈现单个元素(例如,倒数第二个),那么我不明白您为什么要#each通过array. 您需要做的就是将内置lookup帮助程序与现有math帮助程序结合起来,您的模板会变得更加简单:

{{lookup array (math array.length '-' 2)}}

注意:请记住,JavaScript 数组是零索引的,因此我们需要2从最后一个元素中减去第二个元素。

我创建了一个简单的小提琴供参考。

于 2017-10-25T02:20:35.713 回答
1

您可以为此注册自己的助手:

Handlebars.registerHelper('isSecondLastArrayItem', function(array, index, options) {

  if((array.length - 2) === index)
    return options.fn(this);

  return;

});

并像这样使用它:

{{#each array}}
  {{#isSecondLastArrayItem @root.array @index}}
    {{title}}
  {{/isSecondLastArrayItem}}
{{/each}}

示例数据:

{ 
  array: [{ title: 'aa' }, { title: 'vv' }]
}

在沙盒中试一试。

编辑:任何索引的情况

Handlebars.registerHelper('isNthLastArrayItem', function(array, index, offset, options) {

  if(((array.length >= offset) && (array.length - offset) === index)
    return options.fn(this);

  return;

});

用法(用于2nd最后的项目):

{{#each array}}
  {{#isNthLastArrayItem @root.array @index 2}}
    {{title}}
  {{/isNthLastArrayItem}}
{{/each}}
于 2017-10-24T15:52:38.453 回答