javascript - How to pass an object to a .handlebars template and use it in a javascript code block?
问题描述
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>
Browser Console Error: Uncaught SyntaxError: missing ] in computed property name
How can I pass the object to use it in .handlebars template within a script code block?
解决方案
我认为我们需要审查一些事情才能找到解决方案。
首先,我们必须了解Handlebars 中的triple-mustache 标签的含义。默认情况下,Handlebars 会对其输出进行HTML 转义。这是防止跨站点脚本 (XSS)的最佳实践。这意味着使用 input { data: "<p>Hello, World!</p>" }
,Handlebars 模板{{ data }}
将输出:
<p>Hello, World!</p>
在某些情况下,不希望 Handlebars 对其输出进行 HTML 转义,为此,Handlebars 提供了Triple-mustache 标签,它将输出未转义的 HTML。对于上面相同的输入和模板,输出将是:
<p>Hello, World!</p>
其次,我们必须了解当给定一个 JavaScript 对象作为要计算的双(或三)花括号之间的表达式时,Handlebars 会做什么。Handlebars 本质上是用对该表达式的字符串化求值来替换该表达式 - 如果您登录data.toString()
控制台,这就是您将得到的。对于一个对象,字符串化的值将类似于[object Object]
. 请参阅此答案以进行讨论。
对于我们的问题,我们必须弄清楚如何让 Handlebars 渲染我们的整个data
对象,并以有效的 JavaScript 格式进行渲染。由于 Handlebars 将呈现一个字符串,我们可以将一个字符串化的 JSON 对象传递给它,并使用三重胡须来确保我们的引号不会被转义。
我们的路由处理程序变为:
res.render('home', { data: JSON.stringify(data) });
我们的模板变成:
<script type="text/javascript">
var data = {{{ data }}};
console.log(data.one);
</script>
推荐阅读
- tensorboard - 多个数据集之间的 Tensorboard 投影仪动画转换
- jupyter - JupyterHub Spawn 第一次安装报错
- c++ - VS2019:如何解决资源视图中的“未知子语言:0x8”消息?
- c# - 如何清除 Cefsharp (Chromium) 代理缓存以更改代理凭据?
- windows - 为什么我的 Anaconda 提示修饰符显示完整的环境路径?
- apache - apache2.service 的作业失败,因为控制进程以错误代码退出。请参阅“systemctl status apache2.service”
- javascript - 用于作为函数参数的可选值组的打字稿
- python - 如何使用python将元素添加到json对象中的特定位置
- c++ - 我可以为随机数生成种子作为函数的静态变量吗?
- python - 如何将只有音频的 mp4 转换为 numpy 数组