Handlebars作用域问题:不能从嵌入的' each '访问模板变量

Handlebars Scope Issue: Can't access template variable from embedded `each`

本文关键字:each 变量 访问 问题 作用域 不能 Handlebars      更新时间:2023-09-26

我想弄清楚为什么我不能从我的把手模板(在我的keystone项目中呈现)中嵌入的each语句内访问我的模板变量。我在StackOverflow上读过很多类似的问题,但是没有一个能解决我的特殊用例。

我有一个简单的数据对象,它被传递到Handlebars模板,看起来[大致]像这样:

{ 
   rootPath: '../../../', 
   navigation: { all: { 'a': { sublinks: [Object] }
}
我的问题是:

为什么rootPath模板变量在{{#each navigation.all}}中打印完美,而在{{#each sublinks}}中却无法打印?

这是我的车把模板:

<!-- rootPath prints fine here -->
Here is your rootPath variable: {{rootPath}}
{{#each navigation.all}}
    <!-- rootPath prints fine here -->
    top-level rootPath: {{../rootPath}}
    {{#if sublinks}}
            {{#each sublinks}}
                <!-- WHY WON'T ROOTPATH PRINT HERE?? -->
                <!-- Obviously, I am trying the three possible scope paths -->
                sub-level rootPath attempt 1: {{../../rootPath}}
                sub-level rootPath attempt 2: {{../rootPath}}
                sub-level rootPath attempt 3: {{rootPath}}
            {{/each}}
    {{/if}}
{{/each}}

我得到以下输出(注意所有子级尝试都不能访问rootPath模板变量):

<>之前这是你的rootPath变量:../../../顶级rootPath:…/…/…/sublevel rootPath尝试1:sublevel rootPath尝试2:sublevel rootPath尝试3:之前

我需要的是rootPath无处不在,所以我可以得到这样的东西:

<>之前这是你的rootPath变量:../../../顶级rootPath:…/…/…/sublevel rootPath:…/…/…/之前

那么我在这里遗漏了什么范围问题或语法?

我正在使用Handlebars版本2.0.0,因为这是由keystone预先打包的。

我可以通过使用@root令牌来解决这个问题。

只要从嵌入的{{#each sublinks}}中调用@root.rootPath就足以解决我的问题。

下面是正确的模板标记:
Here is your rootPath variable: {{rootPath}}
{{#each navigation.all}}
    top-level rootPath 1: {{../rootPath}}      <!-- works -->
    top-level rootPath 2: {{@root.rootPath}}   <!-- works -->
    {{#if sublinks}}
            {{#each sublinks}}
                sub-level rootPath 1: {{@root.rootPath}}  <!-- works -->
                sub-level rootPath 2: {{../../rootPath}}  <!-- doesn't work -->
            {{/each}}
    {{/if}}
{{/each}} 

生成如下输出:

<>之前这是你的rootPath变量:../../../顶级rootPath 1:…/…/…/顶级rootPath 2:…/…/…/子级别rootPath 1:…/…/…/sublevel rootPath 2:之前

注意:用于顶级rootPath(在{{#each navigation.all}}中,我可以使用其中之一:

{{../rootPath}}      <!-- works -->
{{@root.rootPath}}   <!-- works -->

然而,从嵌入的{{#each sublinks}}中,只有@root.rootPath似乎可以工作:

{{@root.rootPath}}  <!-- works -->
{{../../rootPath}}  <!-- doesn't work -->