You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Handlebars中{{#times}}嵌套{{#each}}无法渲染teamName的问题

问题分析与解决方案

问题根源是Handlebars上下文切换:你的times助手在循环时,将块内的上下文替换成了循环变量i(数字),而team数据存放在times块的父级上下文中,直接写{{#each team}}会找不到对应数据——当前上下文是数字i,它没有team属性。

下面提供两种可行的解决办法:

方案1:修改模板,通过父级路径访问team

在times块内,使用../引用父级上下文的team数据,直接修改模板中的each部分:

<select name="groupNo{{this}}" id="" multiple>
    {{#each ../team}}
    <option value="{{_id}}">{{teamName}}</option>
    {{/each}}
</select>

如果team数据在根上下文(最外层),也可以用@root.team直接定位:

{{#each @root.team}}
<option value="{{_id}}">{{teamName}}</option>
{{/each}}

方案2:修改times助手,保留原上下文

调整times助手的实现,让它在渲染循环块时保留原有的上下文,同时传递循环索引:

const hbs = exphbs.create({
    "helpers": {
        "times": function(n, block) {
            let accum = '';
            const parentCtx = this;
            for (let i = 1; i <= n; ++i) {
                // 合并原上下文和循环索引,作为新的上下文传入
                accum += block.fn({ ...parentCtx, groupIndex: i });
            }
            return accum;
        },
        "eq": function (a, b) {
            return a === b;
        }
    }
});

同时修改模板中引用循环索引的部分,用{{groupIndex}}代替原来的{{this}}:

<h2>Grup {{groupIndex}}</h2>
<select name="groupNo{{groupIndex}}" id="" multiple>
    {{#each team}}
    <option value="{{_id}}">{{teamName}}</option>
    {{/each}}
</select>

两种方案都能解决你的问题,方案1无需修改助手代码,更快捷;方案2让上下文逻辑更清晰,适合复杂场景。

内容的提问来源于stack exchange,提问作者atuna00

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:43:13