所以我有这个HTML文件,其中包含一堆模板,我想在加载页面开始时编译这些模板。它们可以一次编译所有内容,然后存储到数组中(可能),或者当您转到 SPA 的页面时,它会编译并存储页面的模板,或者,如果它已经编译,只需查找并使用编译的页面,而无需每次访问时重复编译同一页面。 我正在使用JS和车把.js,你能帮我提供一些关于如何实现目标的建议吗?目前有一个不起作用的函数,我需要修改和实现:
function compile_template(template) {
var template_source;
if (templates_compiled[template] === undefined)
{
template_source = $("#" + template).html();
return Handlebars.compile(template_source);
}
}
那是在按如下方式使用之后:
template = "template_projects";
templates_compiled[template] = compile_template(template);
$("#div_page_data_container").html(templates_compiled[template](page_data));
我不完全确定您问题的根本原因是什么。我怀疑在提供的代码之外存在一些问题,这些问题正在产生影响。
但是,我可以提出一些建议,我相信这些建议将使您的缓存功能更易于使用。
我看到的第一个问题是您的compile_template
函数从templates_compiled
缓存对象读取但不写入它。这意味着调用compile_template
的代码必须"记住"始终将结果从compile_template
添加到templates_compiled
。
其次,当templates_compiled[template] === undefined
计算结果为false
时,compile_template
不返回任何内容(即undefined
)。这会让调用代码负责在调用compile_template
之前检查templates_compiled[template]
是否有值。compile_template
中的条件"泄漏"了缓存查找的抽象,迫使调用代码"知道"compile_template
的内部结构。
我会重写缓存函数,以便它是代码中唯一需要了解缓存的部分。下面是一个示例:
const compiledTemplates = {};
function getCompiledTemplate(key) {
if (compiledTemplates[key]) {
return compiledTemplates[key];
}
const templateSource = $(`#${key}`).html();
const compiledTemplate = Handlebars.compile(templateSource);
compiledTemplates[key] = compiledTemplate;
return compiledTemplate;
}
let template;
template = getCompiledTemplate('template_projects'); // template not found in cache, is freshly compiled by Handlebars
template = getCompiledTemplate('template_projects'); // compiled template is returned from `compiledTemplates` cache