如何在Pebble模板中检测for循环中的最后一项?

时间:2018-06-02 19:11:55

标签: pebble

如何在Pebble模板(http://www.mitchellbosecke.com/pebble/home)中的for循环中检测列表中的最后一项?

我正在使用Pebble生成JSON。我有一个我需要迭代的对象列表,除了最后一个之外,我需要在每个对象之后加一个逗号。

这是相关的模板代码,我厌倦了在IF语句中使用loop.index和loop.length。但是它不起作用(无论如何我都需要检查loop.length -1)。

模板:

"menu": {
    "items": {
    {% for menuItem in menuItems %}
    "{{ menuItem.name }}": "{{ menuItem.value }}"{%- if loop.index < loop.length %},{% endif %}
    {%- endfor %}
    }
}

示例所需输出:

"menu": {
    "items": {
         "item1": "Item 1",
         "item2": "Item 2
    }
}

之前我使用过Jinja2 Python模板引擎,它的语法类似于Pebble。 Jinja2还有一个index.last属性,它是一个布尔值,可以在这样的IF语句中使用。我不知道Pebble中有类似的东西。

2 个答案:

答案 0 :(得分:2)

在循环内部,Pebble提供了一些特殊变量来帮助您:

  • loop.index:从零开始的索引,每次迭代都会递增。
  • loop.length:我们正在迭代的对象的大小。
  • loop.first:如果是第一次迭代,则为true
  • loop.last:如果最后一次迭代,则为true
  • loop.revindex:从循环结束起的迭代次数

文档更新,此处缺少变量

https://github.com/PebbleTemplates/pebble/wiki/for

答案 1 :(得分:1)

首先,我认为您应该查看Jackson或GSON之类的专用JSON库。它可能更适合您要做什么。

也就是说,我遇到了同样的问题,最新版本在循环中包含属性< Button android:text="Login" android:id="@+id/login_btn_login" android:layout_height="35dp" style="@style/button_style" /> loop.firstloop.last

我在以下测试中找到了它。

https://github.com/PebbleTemplates/pebble/blob/11dd4783d44afbeb269c9d98cf9579aad0e53394/pebble/src/test/java/com/mitchellbosecke/pebble/CoreTagsTest.java#L177