首页 文章

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

提问于
浏览
2

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

如何将完成的变量设置为每页唯一,而无需更改每个页面以使用不同的变量名称 .

2 回答

  • 2

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

    如果你看liquid::increment code,你可以看到它是如何工作的,上下文 myvar 和本地 myvar 之间的界限在哪里 .

    请注意,上下文 myvar 将在所有页面,帖子中传递 . 这是一个"global"变量 .

    在第一页:

    {% increment myvar %} - > output : 0

    • 检索上下文 myvar ,如果是 nil 则分配0

    • 将其存储在临时变量中

    • 进行后期增量( myvar++

    • 将值(1)存储在 myvar 上下文变量中

    • 打印临时变量(0)

    {{ myvar }} - > output : 1

    由于 myvar 未分配给局部变量, this liquid tag is using the fallback value of the context variable myvar 但不会对其进行修改 .

    在第二页:

    {% assign myvar = 100 %}

    100 分配给本地 myvar 变量 .

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

    • 检索上下文 myvar ,即1

    • 将其存储在临时变量中

    • 做后期增量( myvar++

    • 将值(2)存储在 myvar 上下文变量中

    • 打印临时变量(1)

    {{ myvar }} - > output : 100

    myvar 被分配给局部变量时,请使用它 .

    结论

    如果您需要本地计数器,请使用@marcanuy解决方案 .

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

相关问题