2012-04-13 111 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