如何实现Handlebars表达式Helper生成XML属性并获取参数名与上下文值
解决方法
你要实现这个需求有两种可选方案:
方案1:完全符合你要求的调用写法{{attr foo}}
这种方案直接读取Handlebars调用时的AST参数节点获取属性名,不需要修改调用格式:
- 注册Helper的代码如下:
const Handlebars = require('handlebars'); Handlebars.registerHelper('attr', function (attrValue, options) { // 从调用AST中读取传入参数的原始字面量名称 const attrName = options.ast.params[0].original; // 对属性值做XML转义,避免特殊字符导致格式错误 const escapedValue = Handlebars.Utils.escapeExpression(attrValue); return `${attrName}="${escapedValue}"`; });
- 效果验证
当上下文为{ foo: "fooval" }时,调用{{attr foo}}会直接输出foo="fooval",完全符合你的预期。
注意:该方案依赖Handlebars内部的AST结构设计,大版本升级时需要验证兼容性。
方案2:更稳定的兼容写法
如果担心版本兼容性问题,可以选择改动少量调用格式,将属性名以字符串形式传入:
- 注册Helper的代码如下:
const Handlebars = require('handlebars'); Handlebars.registerHelper('attr', function (attrName, options) { // 从当前上下文读取对应属性的值,支持嵌套路径 const attrValue = options.lookup(this, attrName); const escapedValue = Handlebars.Utils.escapeExpression(attrValue); return `${attrName}="${escapedValue}"`; });
- 调用方式改为:
{{attr "foo"}}
该方案不依赖Handlebars内部私有结构,所有版本都可正常使用。
内容的提问来源于stack exchange,提问作者redgiant
相关产品推荐
相关产品推荐

