ヘルパーの登録
複数のヘルパーを同時に登録できます。$.views.helpersメソッドを呼び出し、ヘルパーの名前をキーとする連想配列を渡します。
$.views.helpers({
ConvertToDateString: function(dateTime){ return dateTime.toLocaleDateString(); }
message: "Hello JsRender helpers!",
});
ヘルパーを登録する際に、ヘルパーを使用するテンプレートを指定することもできます。こうすると、指定したテンプレートだけが、そのヘルパーを使用します。複数のテンプレートを使用する際に、他のテンプレートへ影響を与えずにヘルパーを定義できるので、ヘルパーの管理が容易になります。ヘルパーを使用するテンプレートを指定するには、$.templatesメソッドを用いてテンプレートを登録し、$.views.helpersメソッドの第2引数にそのテンプレートを渡します。
<!-- テンプレートの定義1 -->
<script id="itemTemplate" type="text/x-jsrender">
メッセージ:{{>~message}}
</script>
<!-- テンプレートの定義2 -->
<script id="itemTemplate2" type="text/x-jsrender">
メッセージ:{{>~message}}
</script>
// ヘルパーの定義
var helpers = {message: "Hello JsRender helpers!"};
// テンプレートの登録
var myItemTemplate = $.templates("myItemTemplate", "#itemTemplate");
// ヘルパーをmyItemTemplateに登録
$.views.helpers(helpers, myItemTemplate);
この例では、itemTemplateのみがヘルパーを使用します。itemTemplate2からはヘルパーの値を参照できません。
renderメソッドのパラメーターとしてヘルパーを指定できます。こうすると、同じテンプレートで異なるヘルパーを使い分けることが可能です。
// ヘルパーの定義
var helpers1 = {message: "Introduction of JsRender helpers"};
var helpers2 = {message: "JsRender ヘルパーの紹介"};
// テンプレートを使ったテキストの生成
var result1 = $("#itemTemplate").render(item, helpers1);
var result2 = $("#itemTemplate").render(item, helpers2);
helpers1とhelpers2という2種類のヘルパーを定義し、双方に同名のヘルパー定数messageを指定しました。同じテンプレートと同じデータモデルを使いつつも、ヘルパーを切り替えることで、異なる結果が得られます。
ヘルパー定数・変数
関数だけでなく、定数や変数、オブジェクトをヘルパーとして登録できます。
ヘルパー定数の活用例を紹介します。例えば、テンプレート内で繰り返し使われるエラーメッセージをヘルパーとして登録すると、テンプレートの冗長性が減る上に、メッセージの管理が容易になります。また、ヘルパーを差し替えることで、他の言語にも対応できます。
<!-- テンプレートの定義 -->
<script id="itemTemplate" type="text/x-jsrender">
名前:
{{if name}}
{{>name}}
{{else}}
{{>~errorEmptyName}}
{{/if}}
<br/>
住所:
{{if address}}
{{>address}}
{{else}}
{{>~errorEmptyAddress}}
{{/if}}
<br/>
</script>
<script type="text/javascript">
// データモデルの定義
var item = {
name: null,
address: null
};
// ヘルパーの定義
var errorMessages = {
errorEmptyName: "名前を入力してください",
errorEmptyAddress: "住所を入力してください"
};
// テンプレートを使ったテキストの生成
var result = $("#itemTemplate").render(item, errorMessages);
// div要素の中身を入れ替える
$("#placeholder").html(result);
</script>
まとめ
今回はJsRenderを拡張する方法を見てきました。JsRenderでは、コンバーターやカスタムタグ、ヘルパーを定義することで機能を追加できます。
これまで、JsRenderの概要と基本的な使い方、{{if}}や{{for}}などの便利な機能、テンプレートの合成、そして、JsRenderを拡張する方法について紹介してきました。
次回からは、JsRender上で動くMVVMフレームワークであるJsViewsを紹介していきます。
