id
属性を使用して、一意性の問題を処理するサーバー側の処理を一切行わずにテンプレートを識別できるようになります。しかし、クラスを使用してテンプレートを識別することができます。
あなたは優先順位(「基本」テンプレートまず、「サブテンプレート」の後)で一緒にすべてのあなたのテンプレートのHTMLファイルをマッシュアップして、テンプレートを識別するためにclass
属性を使用する場合:
<!-- templates.html -->
<script type="text/template" id="fooTemplate">
<div class="foo">
</div>
</script>
<script type="text/template" id="barTemplate">
<p>Bar!</p>
</script>
<!-- newTemplates.html -->
<script type="text/template" id="fooTemplate">
<ul class="foo">
<li class="bar">Blah!</li>
</ul>
</script>
次に、あなたのようなものを使用することができます
var foo = _.template($('.fooTemplate:last').html());
var bar = _.template($('.barTemplate:last').html());
あなたのテンプレートにアクセスします。
デモ:http://jsfiddle.net/ambiguous/gYHkF/
またid
Sに固執し、newTemplates.html
最初からテンプレートをロードし、あなたがそれを見つけていない場合templates.html
にフォールバックしようとすることができます。次の2つの別々の変数にテンプレートファイルをロードするが、はDOMにそれらを挿入しない場合:
var $base = $('stuff from templates.html');
var $subs = $('stuff from newTemplates.html');
はその後$base
前$subs
でテンプレートを探すために、単純な機能を追加します。
function tmpl(id) {
var $t = $subs.filter('#' + id);
if($t.length)
return _.template($t.html());
return _.template($base.filter('#' + id).html());
}
次に、これを行うことができます:
var foo = tmpl('fooTemplate');
var bar = tmpl('barTemplate');
そして正しいことが起こります。
デモ:http://jsfiddle.net/ambiguous/EhhsL/
このアプローチは、コンパイル済みのテンプレートをキャッシュし、二重の検索を避けるが、何度も何度も同じことをコンパイル避けるだけでなくすることが容易になります:
function tmpl(id) {
if(tmpl.cache.hasOwnProperty(id))
return tmpl.cache[id];
var $t = $subs.filter('#' + id);
if($t.length)
return tmpl.cache[id] = _.template($t.html());
return tmpl.cache[id] = _.template($base.filter('#' + id).html());
}
tmpl.cache = { };
はデモ:http://jsfiddle.net/ambiguous/YpcJu/
私は2番目の解決策が本当に好きです。パフォーマンスのペナルティはどれくらいのものだと思いますか? – stinkycheeseman
@stinkycheeseman:パフォーマンスのヒットは目に見えませんが、(アップデートのように)キャッシュを少し簡単にスリップさせることができます。 –