我刚刚决定第一次尝试require.js,并且在大多数情况下,它运行正常 - 直到我尝试动态处理模板加载。
基本上,我要求应用程序在模板全部加载并可用之前不应继续。为此,创建了一个模板“模板”。它在返回之前导入了需要加载的模板数组(已经可用)的定义。
我很确定这可能是一个反模式,所以你会如何解决它?
app -> requires "templating"
define templating ->
- loop through an array of templates and dynamically create a list
- define all templates (via text!) so later we can require("template-name")
- also tried, require all templates
我观察到模板模块在加载所有模板之前加载并可供应用程序使用。
随后是XHR获取模板。
如何在加载和编译所有文本之前阻止模块返回?伪代码或示例链接没问题。
答案 0 :(得分:1)
我们实际上在项目的早期有一个解决方案,然后转移到另一个解决方案。
[1]同步 - 因为我们在我们的应用程序中使用jQuery,所以我们可以在整个应用程序中使用jQuery Deferred对象。我创建了一个Deferred实例,它只在我的所有模板加载时调用了.resolved()。然后,每当我尝试使用模板时,我都将其包含在这样的代码中:
$.when(cache.templatesLoadedPromise).done(
function () {
// Render the view.
$("...").html($.tmpl(cache.template, jsonData));
});
然后在模板可用之前不会发生任何渲染。
[2]每个模块加载和注册 - 没有人对解决方案[1]感到疯狂,我们希望每个模块只加载该特定模块所需的模板。因此,我们开始将它们列为“text!something.tmpl”要求,然后将该特定模板的注册作为模块中的第一行,并将其作为要求。在我们的例子中,我们使用Handlebars作为模板引擎和ICanHandlebarz(类似于ICanHaz for Mustache)。所以我打电话给ich.addTemplate(“某事”,某事);在模块代码的开头。
在少数情况下,多个模块使用相同的模板,因此在进行注册之前,我必须先测试模板是否已经注册。
我希望其中一个可以帮助你解决问题。