如何将对象传递给 .handlebars 模板并在 javascript 代码块中使用它?

Posted

技术标签:

【中文标题】如何将对象传递给 .handlebars 模板并在 javascript 代码块中使用它?【英文标题】:How to pass an object to a .handlebars template and use it in a javascript code block? 【发布时间】:2022-01-18 00:41:18 【问题描述】:

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 模板中使用它?

【问题讨论】:

【参考方案1】:

我认为我们需要审查一些事项才能找到解决方案。

首先,我们必须了解Handlebars 中的triple-mustache 标签的含义。默认情况下,Handlebars 将html-escape 输出。这是防止Cross-Site Scripting (XSS) 的最佳实践。这意味着输入 data: "&lt;p&gt;Hello, World!&lt;/p&gt;" ,Handlebars 模板 data 将输出:

&lt;p&gt;Hello, World!&lt;/p&gt;

在某些情况下,不希望 Handlebars 对其输出进行 HTML 转义,为此,Handlebars 提供了triple-mustache tag,它将输出未转义的 HTML。对于上面相同的输入和模板,输出将是:

<p>Hello, World!</p>

其次,我们必须理解 Handlebars 在给定一个 JavaScript 对象作为要计算的双(或三)花括号之间的表达式时会做什么。 Handlebars 本质上是用对该表达式的字符串化求值替换该表达式 - 如果您在控制台中记录 data.toString(),这就是您将得到的结果。对于一个对象,字符串化的值将类似于[object Object]。请参阅此answer 进行讨论。

对于我们的问题,我们必须弄清楚如何让 Handlebars 渲染整个 data 对象,并以有效的 JavaScript 格式进行渲染。由于 Handlebars 会渲染一个字符串,我们可以传递一个字符串化的 JSON 对象并使用三重胡须来确保我们的引号不会被转义。

我们的路由处理程序变成:

res.render('home',  data: JSON.stringify(data) );

我们的模板变成:

<script type="text/javascript">
    var data =  data ;
    console.log(data.one);
</script>

【讨论】:

你仍然必须对输出进行 html 转义,即使 &lt;script&gt; 标签内的规则有些不同

以上是关于如何将对象传递给 .handlebars 模板并在 javascript 代码块中使用它?的主要内容,如果未能解决你的问题,请参考以下文章

在 .NET 中通过注入将对象传递给数组

如何将对象传递给 innerHTML (JavaScript) 中的函数?

如何将对象传递给另一个数组对象

将对象传递给另一个类的构造函数

如何将对象传递给 C++ 中的函数?

如何通过NodeJS将对象传递给前端