0

我使用 mustache 在服务器上渲染东西,但也在客户端上。策略是我有一个单页应用程序(在服务器上用小胡子渲染),这个模板从服务器中提取片段并使用它们在客户端上渲染 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。

4

1 回答 1

2

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

服务器端模板:

<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);

我做了一个工作的 jsFiddle 来展示它的工作。查看 console.log 以查看前后的服务器模板。

于 2012-01-25T01:47:11.403 回答