使用express-handlebars(HBS)在循环中比较字符串的问题
我来帮你搞定这个问题!你注册的if_equal辅助函数本身逻辑没问题,问题大概率出在模板里的调用方式或者字符串匹配的细节上,咱们一步步捋清楚:
首先,先把模板里的调用写法修正过来
你之前注释掉的代码只写了开头没闭合,而且正确的嵌套方式应该是把if_equal放在each循环内部,针对每个分类的title做判断。比如你想在匹配到目标字符串时做特殊处理(比如高亮、添加标记),可以这么写:
{{#each info.categories}} <li> <a href="{{this.title}}">{{this.title}}</a> {{#if_equal this.title "מלגזות"}} <!-- 这里写匹配成功后要渲染的内容,比如: --> <span style="color: red;">(当前选中分类)</span> {{else}} <!-- 不匹配时的内容,可选,不需要可以删掉else块 --> {{/if_equal}} </li> {{/each}}
然后排查几个容易踩坑的点
字符串的精确匹配
希伯来语虽然没有大小写区分,但要确保this.title和你写的"מלגזות"完全一致——比如有没有额外的空格、换行符?比如如果this.title实际是" מלגזות"(前面多了空格),就会匹配失败。你可以先在循环里临时加一行{{this.title}},看看实际渲染出来的内容是什么,或者给辅助函数加个调试日志:hbs.registerHelper('if_equal', function(a, b, opts) { console.log('对比的两个值:', a, 'vs', b); // 控制台看实际对比的内容 if (a == b) { return opts.fn(this); } else { return opts.inverse(this); } });上下文与属性存在性
确认info.categories里的每个对象确实都有title属性——如果某个分类的title是undefined或者null,自然匹配不上目标字符串。严格相等的可选优化
如果你的场景需要严格区分类型(比如避免把字符串"123"和数字123误判为相等),可以把辅助函数里的==改成===:hbs.registerHelper('if_equal', function(a, b, opts) { if (a === b) { // 严格相等判断 return opts.fn(this); } else { return opts.inverse(this); } });
按照上面的方式调整后,应该就能正常在循环内判断字符串相等了~
内容的提问来源于stack exchange,提问作者John Yaghobieh
相关产品推荐
相关产品推荐

