requirejs加载异步模板模块模式

时间:2012-04-13 14:39:36

标签: javascript requirejs js-amd

我刚刚决定第一次尝试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获取模板。

如何在加载和编译所有文本之前阻止模块返回?伪代码或示例链接没问题。

1 个答案:

答案 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(“某事”,某事);在模块代码的开头。

在少数情况下,多个模块使用相同的模板,因此在进行注册之前,我必须先测试模板是否已经注册。

我希望其中一个可以帮助你解决问题。