问题描述
server.js:
app.get('/home',function (req,res) {
data['one'] = "first";
data['two'] = "secound";
res.render('home',{ data });
});
home.handlebars:
<script type="text/javascript">
var data = { {{{data}}} };
console.log(data.one);
</script>
浏览器控制台错误:Uncaught SyntaxError: missing ] in computed property name
如何在脚本代码块内的.handlebars模板中传递对象以使用它?
解决方法
我认为有一些事情我们需要进行审查才能得出解决方案。
首先,我们必须了解“三重胡子”标签在车把中的含义。默认情况下,Handlebars将HTML-escape输出。这是防止Cross-Site Scripting (XSS)的最佳做法。这意味着使用输入{ data: "<p>Hello,World!</p>" }
,Handlebars模板{{ data }}
将输出:
<p>Hello,World!</p>
在某些情况下,不希望Handlebars对其输出进行HTML转义,为此Handlebars提供了triple-mustache tag,它将输出未转义的HTML。对于上面相同的输入和模板,输出为:
<p>Hello,World!</p>
第二,我们必须了解当给定JavaScript对象作为双(或三)花括号之间的表达式来评估时,Handlebars的作用。 Handlebars实际上是用对该表达式的字符串化评估来替换该表达式-如果您在控制台中登录data.toString()
,则会得到此结果。对于一个对象,字符串化的值将类似于[object Object]
。参见answer进行讨论。
对于我们的问题,我们必须弄清楚如何获取Handlebars来渲染整个data
对象,并以有效的JavaScript格式进行渲染。由于Handlebars将呈现一个String,我们可以将其传递给一个字符串化的JSON对象,并使用三重小胡子确保我们的引号不会被转义。
我们的路线处理程序变为:
res.render('home',{ data: JSON.stringify(data) });
我们的模板变为:
<script type="text/javascript">
var data = {{{ data }}};
console.log(data.one);
</script>