JavaScript おれおれ Advent Calendar 2011 – 23日目
昨日のデータ埋め込みと一昨日の .replace()に関数を与えるやつを組み合わせて、テンプレートエンジンみたいなのを作成する事ができます。
Ajax/XHRでデータを取得して、その結果を画面に出力するような場面を想定しています。
- テンプレートは
script[type="text/x-mytemplate"]とかでHTML中に書く- キーワードは
{#xxx}の形式
- キーワードは
- キーワードと値の組み合わせをひとつのオブジェクトにまとめて、関数に渡す
HTML
まずはテンプレートと、出力先。
<ul id="mylist"></ul>
<script id="mytemplate" type="text/x-mytemplate">
<li><a href="{#url}">{#title}</a> ... {#description}</li>
</script>
これをHTML中に埋め込んでおきます。ここまではHTMLのコーダーさんにお願いしても大丈夫。
スクリプト
続いてスクリプト。XHR受信の処理とかから呼ぶ関数です。
/**
* 与えられたデータをテンプレートに埋め込み、画面に追加する。
* data.hogeで与えられたものが、テンプレート中の{#hoge}に入る。
* @param {Object} data 全てのデータを格納したもの。
*/
function addItem(data) {
// テンプレート取得
var template = document.getElementById("mytemplate").text;
// テンプレートからHTML作成
var html = template.replace(/{#(\w+)}/g, function(m, key) {
var text = data[key] || ''; // 該当なければ空文字列
return text;
});
// 画面に追加
var elList = document.getElementById('mylist');
elList.innerHTML += html;
}
流れはこんな感じです。
必要に応じて取得した要素を保存しておくとか、入れ子にしたオブジェクトに対応するとかしてください。
そんなんで
いかがでしょ?
UI部とロジック部を分割して記述できるのでコードも綺麗かなと思います。
実行サンプル
むぁーむぁー。