0

サーバーだけでなくクライアントでもレンダリングするために口ひげを使用しています。戦略は、シングルページアプリ(サーバー上で口ひげを使用してレンダリング)を使用し、このテンプレートがサーバーからスニペットを取得し、それらを使用してクライアント上でも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-scalate2.0.2とscala2.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 に答える