我正在使用icanhaz.js和小胡子来加载模板,我正在使用以下方法按需加载小胡子模板:
loadTemplate: function(name, callback) {
if (!ich.templates[name+"_template"]) {
jQuery.get("/js/templates/"+name+".mustache", function(data) {
window.ich.addTemplate(name+"_template", data);
callback();
});
} else {
callback();
}
}
检查在调试器中返回的数据变量,但有时将作为Document对象返回,而不是我可以使用的原始字符串。我有时说,因为如果模板文件中的html在文件顶部没有嵌套的DOM元素,模板会按需加载。这是一种非常奇怪的行为,我很乐意帮助解释。
因此,例如,模板文件:
<div>
<div>My name is {{name}}</div>
</div>
将在加载时作为Document对象返回。
然而,这个模板文件:
<div></div>
<div>
<div>My name is {{name}}</div>
</div>
根据需要作为原始字符串返回。
我不确定为什么没有任何孩子的顶级div应该对被识别为Document与字符串的模板产生影响。有什么想法吗?
答案 0 :(得分:2)
由于您没有向dataType
提供$.get()
参数,因此您正在以“智能猜测”模式运行。 related documentation说:
如果没有指定,jQuery将尝试根据MIME推断它 响应的类型(
XML
MIME类型将产生XML,在1.4JSON
中 将产生一个JavaScript对象,在1.4script
将执行脚本, 其他任何东西都将作为字符串返回。)
因此,您的服务器可能会将某些模板发送为text/html
(或text/plain
),其他模板则发送为text/xml
。检查响应头(使用Fiddler或等效工具)来检查是否确实如此。
顺便说一句,指定请求的数据类型应该完全消除这个问题:
jQuery.get("/js/templates/" + name + ".mustache", function(data) {
window.ich.addTemplate(name + "_template", data);
callback();
}, "html"); // Always return HTML as plain text.