Pure Javascript な jQuery Templates

Web プログラミングを行う場合、さまざまなテンプレートエンジンを使うことになると思います。
ただ、サーバサイドなテンプレートエンジンだと、ajax バリバリなページを作る場合に DOM との相性が悪く、冗長なコードになりがちです。(なりますよね?)


というわけで、Javascript なテンプレートエンジン、jQuery Templates を使ってみましょう。
jQuery Templates は現在β版で、 jQuery 1.5 にマージされるはずだったのですが、結局 1.5 には入っていないようです。
ダウンロード・ドキュメントはこのページから。
http://api.jquery.com/category/plugins/templates/


百聞は一見にしかずということで、簡単に書いてみます。

<script id="tmplUser" type="text/x-jquery-tmpl">
<li>${name} (${age})</li>
</script>

<ul id="users">
</ul>
$(function() {
    var users = [
        { name: 'foo bar', age: 20 },
        { name: 'hoge fuga', age: 30 }
    ];
    $('#tmplUser').tmpl(users).appendTo('#users');
});


ね、簡単でしょ?
.tmpl に配列を渡すと、自動的に複数のテンプレートに展開してくれます。


さて、ここまでは序の口。
次はテンプレートからテンプレートを呼び出します。

<script id="tmplUser" type="text/x-jquery-tmpl">
<li>
    ${name}
    <ul>
        {{tmpl(items) "#tmplUserItem"}}
    </ul>
</li>
</script>
<script id="tmplUserItem" type="text/x-jquery-tmpl">
<li class="item">${name}</li>
</script>

<ul id="users">
</ul>
$(function() {
    var users = [
        {
            name: 'foo',
            items: [
                { name: 'ひのきのぼう', power: 2 },
                { name: 'ラグナロク', power: 10000 }
            ]
        },
        {
            name: 'bar',
            items: [
                { name: 'エクスカリパー', power: 1 },
                { name: 'エクスカリバー', power: 10000 }
            ]
        }
    ];
    $('#tmplUser').tmpl(users).appendTo('#users');
});


ね、簡単でしょ?
さて、この謎のアイテムをクリックすると、power を alert するようにしてみましょう。
変更箇所は Javascript の最後の行だけです。

$('#users')
.delegate('.item', 'click', function() {
    var item = $(this).tmplItem();
    alert(item.data.power);
})
.append(tmpl)
;


ね、簡単…ですよね?
テンプレートごとに割り振られた値を $(this).tmplItem().data で取得できます。
ここでは {{tmpl(items) "#tmplUserItem"}} により、items が(勝手に)展開され、1つ1つのアイテムが取得できているかんじです。


また、tmpl() を実行した結果は jQuery object ですので、append する前にごちゃごちゃと操作することもできます。

var tmpl = $('#tmplUser').tmpl(users);
$('.item', tmpl).click(function() {
    var item = $(this).tmplItem();
    alert(item.data.power);
});
tmpl.appendTo($('#users'));


(続きはそのうち書く)