Как я могу подключить стратегию для борьбы с отсутствующими атрибутами при использовании шаблонов усов - PullRequest
0 голосов
/ 24 января 2012

Я использую усы для рендеринга на сервере, а также на клиенте. Стратегия заключается в том, что у меня есть одностраничное приложение (отображаемое с усами на сервере), и этот шаблон извлекает фрагменты с сервера и использует их для визуализации 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+"}}"))

... но очевидно, что он будет отброшен, как только карта будет обработана в цикле (например, в строке 576 TemplateEngine). Где подходящая точка подключения для этого?

Я также нашел noneString и nullString в RenderContext , но я думаю, что не могу сделать так, чтобы визуализатор выводил ключ, поскольку эти переменные являются просто строками ...

Я использую scalatra-scalate 2.0.2 и scala 2.9.0-1.

1 Ответ

2 голосов
/ 25 января 2012

Вы можете использовать альтернативный разделитель для данных, которые, как вы знаете, будут заполнены на стороне клиента. См .: Набор 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);

Я сделал рабочим jsFiddle, чтобы показать, что он работает . Зайдите на файл console.log, чтобы увидеть шаблон сервера до и после.

...