2012-04-13 69 views
0

我只是决定尝试require.js第一次,大部分时间,它工作正常 - 直到我到了我试图动态处理模板加载的点。requirejs加载异步模板模块模式

基本上,我有一个要求,应用程序不应该继续下去,直到模板已经被加载并可用。

为此,已创建模块“模板”。它会在它返回之前导入一个需要加载的模板数组(定义已经可用)的定义。

我很确定这可能是一个反模式,所以你会如何解决它?

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

我们在项目的早期实际上已经有一个解决方案,然后转移到另一个解决方案。

[1]同步 - 因为我们在我们的应用程序中使用jQuery,所以我们有可用于整个应用程序的jQuery Deferred对象。我创建了一个Deferred实例,只有在加载了所有模板时才调用.resolved()。然后,每个我试图用一个模板我有时间就裹在这样的代码:

$.when(cache.templatesLoadedPromise).done(
    function() { 
    // Render the view. 
    $("...").html($.tmpl(cache.template, jsonData)); 
    }); 

那么所有的渲染会发生,直到模板可用。

[2]每个模块装载和注册 - 没有人是疯狂溶液[1],我们希望每个模块仅加载所需的该特定模块的模板。因此,我们开始只是它们列为“发短信!something.tmpl”的要求,然后做特定模板的登记为有这样的要求,模块内的第一道防线。在我们的例子中,我们使用Handlebars作为模板引擎和ICanHandlebarz(类似ICanHaz for Moustache)。所以我打电话给ich.addTemplate(“某事”,某事);在模块代码的开头。

在少数情况下,多个模块使用相同的模板,所以我不得不测试,看看是否模板是做注册之前已经注册。

我希望其中的一个能帮助你解决你的问题。

+0

欢呼,这有助于。我所有的模板都是为了处理视图,而我实际上可以在视图/模型结束处卸载它们......无论如何还未确定。 – 2012-04-13 16:58:13