JsRender – jQueryとの組み合わせで使うテンプレートエンジン


jQueryをそのまま利用しているWebアプリでは、クライアント側のテンプレートエンジンはしばらくjQuery Templateを使っていましたが、いつのまにかjQueryのテンプレートエンジンはJsRenderというテンプレートエンジンに移行していました。

経緯は「Dancing with Data: jQuery Templates and JsViews: The Roadmap」に書いてあります。

Github: https://github.com/borismoore/jsrender

使い方はリファレンスに詳しい説明があるので、ここではJsRenderを使い始める手順についてデモのサンプルコード01_inserting-data.htmlを使って説明します。

[html title=”http://borismoore.github.io/jsrender/demos/step-by-step/01_inserting-data.html”]
<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery.js" type="text/javascript"></script>
<script src="../../jsrender.js" type="text/javascript"></script>
<link href="../resources/demos.css" rel="stylesheet" type="text/css" />
</head>
<body>
<a href="../demos.html">JsRender Demos</a><br />

<h3>Render template against local data</h3>

<script id="movieTemplate" type="text/x-jsrender">
<div>
{{:#index+1}}: <b>{{>name}}</b> ({{>releaseYear}})
</div>
</script>

<div id="movieList"></div>

<script type="text/javascript">

var movies = [
{ name: "The Red Violin", releaseYear: "1998" },
{ name: "Eyes Wide Shut", releaseYear: "1999" },
{ name: "The Inheritance", releaseYear: "1976" }
];

// Render the template with the movies data and insert
// the rendered HTML under the "movieList" element
$( "#movieList" ).html(
$( "#movieTemplate" ).render( movies )
);

</script>
</body>
</html>
[/html]
このコードを表示すると以下のようになります。
JsRenderDemo

必要なjsファイル

依存するjquery.jsとjsrender.jsのみです。
[html]
<script src="http://code.jquery.com/jquery.js" type="text/javascript"></script>
<script src="../../jsrender.js" type="text/javascript"></script>
[/html]

テンプレートの書き方
テンプレートタグは{{…}}のように記述します。
[html]
<script id="movieTemplate" type="text/x-jsrender">
<div>
{{:#index+1}}: <b>{{>name}}</b> ({{>releaseYear}})
</div>
</script>
[/html]
ここで使われているテンプレートタグについてだけ説明すると

{{: …}}
指定されたパスのデータを表示、値に含まれるHTMLをレンダリングします。

{{> …}}
指定されたパスのデータを表示、値に含まれるHTMLはエスケープされます。

{{:#index+1}}
配列をテンプレートに渡した場合に、0で始まるインデックスを取得できます。

テンプレートの呼び出し
render関数にデータを渡します。
[javascript]
$( "#movieTemplate" ).render( movies )
[/javascript]

,