在使用Mustache模板时,如何插入策略来处理缺少的属性

时间:2012-01-23 21:22:33

标签: mustache scalate

我正在使用小胡子在服务器上渲染内容,但也在客户端上。策略是我有一个单页应用程序(在服务器上用胡子渲染),这个模板从服务器中提取片段并使用它们在客户端上渲染json。

现在问题在于模板。我想在服务器上呈现标签,但保留一些胡子语法以在客户端上呈现。假设我有一个这样的模板:

<html>
<head><title>{{label.title}}</title></head>
<body>
    <h1>{{name}}</h1>
    <p>{{description}}</p>
</body>
</html>

服务器端呈现将填充标签,但现在它还会删除在上下文中不可见的占位符。

<html>
<head><title>Ze zjerman title</title></head>
<body>
    <h1></h1>
    <p></p>
</body>
</html>

有没有办法插入Scalate并避免这种情况?我天真地试图逃脱:

templateEngine.layout(path, Map(attributes:_*).withDefault((key)=>"{{"+key+"}}"))

...但显然一旦通过循环处理地图就会丢弃(例如在TemplateEngine第576行)。这个适当的插件在哪里?

我也在RenderContext中找到了noneString和nullString,但我认为我不能让渲染器输出一个键,因为这些变量只是字符串......

我正在使用scalatra-scalate 2.0.2和scala 2.9.0-1。

1 个答案:

答案 0 :(得分:2)

您可以为您知道将填充客户端的数据使用备用分隔符。请参阅:Set Delimeter

服务器端模板:

<h1>{{title}}</h1>
<p> [[ client.name ]] - [[ client.description ]] </p>

服务器端数据:

{title : "Hello"}

将备用分隔符预先添加到呈现的服务器模板,然后呈现客户端。

var client_template = "{{=[[ ]]=}}" + server_rendered,
client_data = { client : { name : "Max", description : "world"}},
client_rendered = Mustache.render(client_template, client_data);

我做了a working jsFiddle to show it working。查看console.log以查看之前和之后的服务器模板。