GitHub 页面上 Jekyll 上的 Liquid 变量的范围是什么

What the the scope of Liquid variables on Jekyll on GitHub Pages

我创建了一个简单的 Jekyll 页面(由 GitHub 页面处理和托管),其中包含一个 Liquid 计数器变量,我在其中循环遍历一些数据并将其转储出来,并计算具有给定 属性.

例如:

Complete Before: {{ complete }}
{% for book in books %}
Title: {{book.Title}}
{% if book.Completed == "true" %}
{% increment completed %}
{% endif %}
{% endfor %}
Complete After: {{ complete }}

现在我在两个不同的页面上有相同的代码块,但是书中的数据在这两种情况下都不同,但是变量 completed 的值看起来像是在两者的处理过程中保存的导致第一页看起来像

的页面
Complete Before:
Title: Foo
Title: Bar
Complete After: 2

第二页看起来像

Complete Before: 2
Title: Baz
Complete After: 3

如何让完成的变量在每个页面上都是唯一的,而不需要更改每个页面以使用不同的变量名称。

我建议在这种情况下使用 assign 并使用 plus 过滤器增加变量。 increment 的行为与预期略有不同,它不会修改常见的 Jekyll 变量值:

{% assign complete=0 %}
Complete Before: {{ complete }}
 {% for book in books %}
 Title: {{book.Title}}
 {% if book.Completed == "true" %}
 {% complete=complete | plus:'1'  %}
 {% endif %}
 {% endfor %}
 Complete After: {{ complete }}

更新

问题在于它的范围,至少,这不是我自然期望的,这是一个简单的例子来说明它:

{% for post in site.posts limit: 2%}
increment {{forloop.index}}
- before {{complete}}
- current increment: {% increment complete %}
- after {{complete}}

<hr>
{% endfor %}

New loop

{% for post in site.posts limit: 2%}
increment {{forloop.index}}
- before {{complete}}
- current increment: {% increment complete %}
- after {{complete}} EXPECTED: {{forloop.index}}

<hr>
{% endfor %}

输出:

increment 1

    before
    current increment: 0
    after 1

increment 2

    before 1
    current increment: 1
    after 2

New loop

increment 1

    before 2
    current increment: 2
    after 3 EXPECTED: 1

increment 2

    before 3
    current increment: 3
    after 4 EXPECTED: 2

如果您查看 liquid::increment code,您可以了解它是如何工作的以及上下文 myvar 和本地 myvar 之间的边界在哪里。

请注意,上下文 myvar 跨所有页面传递,posts。这是一个 "global" 变量。

第一页:

{% increment myvar %} -> 输出:0

  • 检索上下文 myvar,如果是 nil
  • ,则分配 0
  • 将其存储在临时变量中
  • post 递增 (myvar++)
  • 将值 (1) 存储在 myvar 上下文变量中
  • 打印临时变量(0)

{{ myvar }} -> 输出:1

由于 myvar 未分配给局部变量,此 liquid 标签正在使用上下文变量 myvar 的后备值,但没有修改它。

第二页:

{% assign myvar = 100 %}

100 分配给本地 myvar 变量。

{% increment myvar %} -> 输出:1

  • 检索上下文 myvar,即 1
  • 将其存储在临时变量中
  • post 递增 (myvar++)
  • 将值 (2) 存储在 myvar 上下文变量中
  • 打印临时变量(1)

{{ myvar }} -> 输出:100

由于myvar被赋值给一个局部变量,所以使用它。

结论

如果您需要本地柜台,请使用@marcanuy 解决方案。

如果您需要全局计数器,请使用 {% increment myvar %} 标记并且不要依赖 {{ myvar }} 来打印其值,因为您不确定本地 myvar 是 assigned/declared.