如何在Mustache模板的{{# ... }}表达式前添加大括号?
在Mustache模板中给
{{# .. }}表达式前添加大括号的实现方法 嘿,我懂你要解决的问题了——就是想在Mustache的区块表达式(像{{#things}}这种)前面输出一个字面量的大括号,同时还要根据things数组的内容渲染出对应的结果对吧?你之前试的\{{{#things}} {{name}} {{/things}}\}不管用,其实是没搞对Mustache里转义和区块语法的优先级~
下面给你两种靠谱的实现方案,完全贴合你的示例场景:
方案一:直接输出字面量大括号 + 结合区块/反区块逻辑
其实Mustache不会把模板里单独的{或}当作语法解析,你可以直接把它们写在模板里,然后用Mustache的**区块(section)处理有数据的情况,用反区块(inverted section)**处理空数组的情况,完美匹配你的两个输入:
最终模板代码
<pre> {{#things}} { listOfThings: [ {{#.}}"{{name}}"{{^@last}}, {{/last}}{{/.}} ] } {{/things}} {{^things}} {} {{/things}} </pre>
效果验证
- 当输入是
{ "things": [] }时,反区块{{^things}}触发,输出<pre>{}</pre> - 当输入是
{ "things": [ { "name": "thing1" }, { "name": "thing2" } ] }时,区块{{#things}}触发,输出<pre>{ listOfThings: [ "thing1", "thing2" ] }</pre>
为什么你的初始尝试无效?
你写的\{{{#things}}是把三个大括号连在一起,Mustache会把{{{识别为不转义的变量输出语法,而不是你想要的“转义一个大括号再加区块表达式”。正确的做法是把字面量的{直接和Mustache表达式分开写,不需要额外转义,Mustache只会解析{{...}}包裹的部分。
方案二:临时切换分隔符(适合复杂场景)
如果遇到字面量大括号和Mustache语法紧挨着容易混淆的场景,你可以临时切换Mustache的分隔符,避免冲突:
<pre> {{=<% %>=}} { <%#things%>listOfThings: [ <%#.%>"<%name%>"<%^@last%>, <%/last%><%/.%> ] <%/things%> } <%={{ }}=%> </pre>
这里{{=<% %>=}}把Mustache的分隔符改成了<% %>,这样模板里的{和}就只会被当作普通字符串输出,最后用<%={{ }}=%>切回原来的{{ }}分隔符。不过针对你的场景,方案一已经足够简洁了。
内容的提问来源于stack exchange,提问作者Ruslan Gunawardana




