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 并尝试从 first 加载模板,如果找不到则newTemplates.html
回退到它。templates.html
如果您将模板文件加载到两个单独的变量中,但不将它们插入 DOM:
var $base = $('stuff from templates.html');
var $subs = $('stuff from newTemplates.html');
$subs
然后添加一个简单的函数来在before中查找模板$base
:
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/