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.
我创建了一个简单的 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.