Handlebars条件助手开发求助:基于permission_id渲染对应内容
解决方案
问题根源
你写的permissionCheck助手没有返回值,不管是作为{{#if}}的参数还是自定义块助手使用,都无法传递有效的布尔判断结果,导致条件渲染失效。
方案1:修改助手为返回布尔值,配合{{#if}}使用
修改服务器端的助手,让它直接返回判断后的布尔值:
const hbs = exphbs.create({ helpers: { permissionCheck: function(value){ // 直接返回判断结果:value < 2时返回true,否则返回false return value < 2; } } });
然后在Handlebars模板中这样使用:
{{#if (permissionCheck req.session.permission_id)}} <!-- 第一段HTML:permission_id < 2时显示 --> <div>权限等级1:可查看内容A</div> {{else}} <!-- 第二段HTML:permission_id >=2时显示 --> <div>权限等级2+:可查看内容B</div> {{/if}}
方案2:自定义块级助手直接处理渲染
如果想直接用块级助手实现逻辑,需要在助手中调用this.fn()渲染满足条件的内容,this.inverse()渲染不满足的内容:
const hbs = exphbs.create({ helpers: { permissionCheck: function(value, options){ if (value < 2) { // 渲染{{#permissionCheck}}和{{else}}之间的内容 return options.fn(this); } else { // 渲染{{else}}之后的内容 return options.inverse(this); } } } });
模板中使用方式:
{{#permissionCheck req.session.permission_id}} <!-- 第一段HTML:permission_id < 2时显示 --> <div>权限等级1:可查看内容A</div> {{else}} <!-- 第二段HTML:permission_id >=2时显示 --> <div>权限等级2+:可查看内容B</div> {{/permissionCheck}}
注意事项
- 确保
req.session.permission_id能正确传递到模板中,如果你用的是Express,可通过中间件把session挂载到res.locals,比如app.use((req, res, next) => { res.locals.session = req.session; next(); }),之后模板中用session.permission_id调用更稳妥。 - 若
permission_id可能为非数字类型,建议先做类型转换,比如return Number(value) < 2;,避免判断出错。
内容的提问来源于stack exchange,提问作者James P.
相关产品推荐
相关产品推荐

