您好我正在使用Express Handlebars设置[https://github.com/ericf/express-handlebars][1]来呈现已编译和预编译的模板。在预编译的情况下,我已经配置了快速中间件,以获得把手模板作为预编译和手动配置的车把预编译模板的注册,如下所示:
hbs.getTemplates('views/partials/page/', {
cache : app.enabled('view cache'),
precompiled: true
}).then(function (templates) {
var templatesArr = hbs.handlebars.templates = hbs.handlebars.templates || {}
// extract all templates names and values
templates = Object.keys(hbs.handlebars.templates).map(function (name) {
//get precompiled template data
var templateSpec = templates[name]
//Inject precompiled data into Handlebars.template method
var precompileTemplateRef = hbs.handlebars.template(templateSpec)
//templateSpec is treated as String rather than Object
//and this is where the things break because
//handlebars.template expects Object
//Register precompileTemplateRef with Handlebars so that
//precompiled template can be extracted for later use by using
//template name
templatesArr[name] = precompileTemplateRef
});
当我运行快速服务器时,hbs.handlebars.template没有被执行,因为上面提到的templateSpec是作为字符串而不是对象接收的。
即使使用JSON.parse(templateSpec)也不起作用,因为预编译输出不是JSON而是Object literal。
预编译输出如下所示:
{"1":function(container,depth0,helpers,partials,data) {var helper;ret.......
我想知道是否可以在运行时将预编译的输出注入Handlebars.template(templateSpec)或者我是否必须在文件系统中创建已经使用Handlebars.templates注册的预编译模板。
如果是编译模板,则没有问题。
非常感谢提前
答案 0 :(得分:0)
根据以下链接,这是Handlebars的一个未解决的问题: https://github.com/wycats/handlebars.js/issues/922 https://github.com/wycats/handlebars.js/issues/1033
var templateSpec = (new Function('return ' + templates[name])());
将解决问题