我有一个handlebars.js模板,就像这样:

{{externalValue}}

<select name="test">
    {{#each myCollection}}
       <option value="{{id}}">{{title}} {{externalValue}}</option>
    {{/each}}
</select>

这是生成的输出:

myExternalValue

<select name="test">
       <option value="1">First element </option>
       <option value="2">Second element </option>
       <option value="3">Third element </option>
</select>

正如预期的那样,我可以访问myCollection的每个元素的id和title字段来生成我的select。在select之外,我的externalValue变量被正确打印(“myExternalValue”)。

不幸的是,在options的文本中,externalValue值从未打印出来。

我的问题是:如何从循环内访问handlebars.js每个范围之外的变量?


Try

<option value="{{id}}">{{title}} {{../externalValue}}</option>

. ./路径段引用的父模板作用域应该是你想要的。


或者你可以像这样使用绝对路径:

<option value="{{id}}">{{title}} {{@root.user.path.to.externalValue}}</option>

我看到了许多带有404的关于这个主题的文档链接。

我更新了这个,它在2020年4月1日工作:

https://handlebarsjs.com/guide/expressions.html#path-expressions

一些帮助器,如#with和#each允许您深入到嵌套对象中。当你包括../分段到你的路径中,句柄会变回父上下文。

    {{#each people}}
    {{../prefix}} {{firstname}} 
    {{/each}}

即使在注释的上下文中打印了名称,它仍然可以返回到主上下文(根对象)检索前缀。

警告

确切的值是…/将根据调用块的helper解析为不同的值。使用. ./只在上下文变化时才有必要。诸如{{#each}}这样的helper的子元素需要使用..而诸如{{#if}}之类的helper的子元素则没有。

{{permalink}}
{{#each comments}}
  {{../permalink}}

  {{#if title}}
    {{../permalink}}
  {{/if}}
{{/each}}

在本例中,上述所有前缀都引用相同的前缀值,尽管它们位于不同的块中。这个行为在Handlebars 4中是新的,发布说明讨论了之前的行为以及迁移计划。


并没有回答最初的问题,但我遇到了一个类似的问题—— 我有一个自定义帮助器,它没有在它里面呈现变量。

我的助手类似于把手如果助手,所以它不应该需要../路径语法。 事实证明,我在注册helper时使用了一个胖箭头函数,这在胖箭头函数中是不同的。

改变:

Handlebars.registerHelper('ifeq', (v1, v2, options) => {    

to:

Handlebars.registerHelper('ifeq', function (v1, v2, options)  {

为我修正了