如何向Handlebars.compile()传入变量并在模板中使用?
解决Handlebars模板中传入局部判断参数的问题
嘿,我来帮你搞定这个问题!首先得明确一点:Handlebars.compile()的第二个参数是编译选项(比如是否禁用HTML转义、自定义helpers等),并不是给模板使用的渲染变量,所以你直接传myFlag进去是不会被模板识别的。
不过你想要的需求完全有简便的实现方式,核心思路是:把你的myFlag和业务数据json合并成一个上下文对象,一起传给模板函数——因为模板函数的参数就是渲染时的上下文,模板里的所有变量都来自这个对象。
具体步骤:
- 正常编译模板:不需要给
compile()传额外参数,保持原来的写法就行:
var template = Handlebars.compile($('#scriptQuestionsForActivity').html());
合并数据并渲染:把
myFlag作为属性添加到你的业务数据对象中,一起传给模板函数。这里提供几种兼容不同场景的写法:- ES6扩展运算符(现代浏览器/支持ES6的环境):
$('#output').append(template({ ...json, myFlag: true }));- 使用
Object.assign(兼容ES5+):
var renderData = Object.assign({}, json, { myFlag: true }); $('#output').append(template(renderData));- 使用jQuery的
$.extend(如果你已经引入了jQuery):
var renderData = $.extend({}, json, { myFlag: true }); $('#output').append(template(renderData));模板中直接使用变量:现在模板里就可以直接通过
myFlag进行判断了。如果你的myFlag是布尔值,直接用{{#if}}就足够:
{{#if myFlag}} <!-- 当myFlag为true时显示的内容 --> {{else}} <!-- 当myFlag为false时显示的内容 --> {{/if}}
如果你确实需要使用eq helper(比如判断非布尔值的情况),Handlebars 4.0+内置了这个比较helper,直接用就行:
{{#if (eq myFlag true)}} <!-- 内容 --> {{/if}}
为什么之前的helper方法不行?
你提到的全局helper方案失效,是因为helper是全局注册的,它无法访问你局部作用域里的myFlag变量。而把变量放进渲染上下文里,是Handlebars设计中传递局部变量的标准方式,既简洁又符合框架的使用逻辑。
内容的提问来源于stack exchange,提问作者gene b.
相关产品推荐
相关产品推荐

