【问题标题】:What the the scope of Liquid variables on Jekyll on GitHub PagesGitHub Pages 上 Jekyll 上 Liquid 变量的范围
【发布时间】:2017-01-12 06:45:19
【问题描述】:

我创建了一个简单的 Jekyll 页面(由 GitHub Pages 处理和托管),其中包含一个 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

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

【问题讨论】:

  • 无法复制。你有存储库网址吗?
  • @DavidJacquel - 查看两个降价页面in this repo 和相关联的pages rendered on GitHub pages here。如您所见,这些页面不共享任何代码,它只是一个同名变量,但在两个页面之间共享。

标签: variables scope jekyll liquid github-pages


【解决方案1】:

我建议在这种情况下使用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

【讨论】:

  • 啊,plus 过滤器。我试图在没有任何运气的情况下使用 complete = complete + 1 并且没有看到过滤器替代方案。你知道我在哪里可以找到有关increment 行为的任何其他详细信息。应该如何期望增量表现?我想使用增量的常见情况是什么?
  • 我不必使用increment,我只是习惯使用assign,过滤器让我可以更好地控制变量,比如增加多少等。你可以在此处查看一些 increment 示例:help.shopify.com/themes/liquid/tags/variable-tags#increment
  • 没有一个例子真正解释了为什么增量不会像我期望的那样运行。当您说它不会修改常见的 Jekyll 变量值时,您是什么意思。您是否只是指增量变量与分配的变量值不同的事实。这无法解释这种行为。
  • 感谢您尝试澄清,但您所做的只是重新显示我遇到的原始问题是什么。我可以看到自己增量的行为不同。我希望有一些文档可以解释为什么它的行为不同以及会发生什么(例如,要从哪个页面开始计算?它只是同一目录中的页面吗?)。
【解决方案2】:

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

请注意,上下文 myvar 会在所有页面、帖子中传递。这是一个“全局”变量。

在第一页:

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

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

{{ myvar }} -> 输出:1

由于myvar 未分配给局部变量,此液体标记使用上下文变量myvar 的后备值,但未对其进行修改。

在第二页:

{% assign myvar = 100 %}

100 分配给本地myvar 变量。

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

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

{{ myvar }} -> 输出:100

因为myvar 被分配给一个局部变量,所以使用它。

结论

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

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

【讨论】:

  • 很好的解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
相关资源
最近更新 更多