2012-11-13 15 views
1

我正在編寫一個框架,允許您的模塊在提供之前定義將哪些JS文件添加到頁面中。這個想法是,一個模塊可能會增加這樣的:頁面中有多個js文件,每個文件都以require()開頭:錯誤的練習還是OK?

require([ 'dojo/topic', 'dojo/_base/window', 'hotplate/hotDojoWidgets/AlertBar' ], function(topic, win, AlertBar 
){ 
    globalAlertBar = new AlertBar({ background: '#FF4444' }); 
    globalAlertBar.placeAt(document.body, 'first'); 
    globalAlertBar.startup(); 

    topic.subscribe('globalAlert', function(message, displayFor){ 
    displayFor = displayFor || 2500; 
    globalAlertBar.set('message', message); 
    globalAlertBar.show(displayFor); 
    }); 
}); 

這讓我舉例來說,允許在應用程序中其他窗口小部件,以便顯示出alertBar發佈globalAlert。 現在:

  • 添加到要加載的JS列表的任何JS/Dojo文件都以「require」開頭。對我來說,這是簡單的異步代碼,將在加載後的某個時間點運行。在框架中以這種方式加載的大多數代碼將等待主題發佈,並將相應地採取行動
  • 「應用程序」將只是其中一個模塊,它將訂閱發佈容器對象的主題
  • 通過加載「正確的」 Dojo小部件需要()顯然將使用「定義」 - 這是一切照舊,沒有後顧之憂有

問題:

1)如果我在JS的一箇中運行ready() /在頁面中引用的Dojo文件將是一個頁面級的ready(),包括所有加載的.js文件該文件?還是僅限於當前文件加載的文件? 2)我意識到,「正確的」做事方式是隻有一個運行require()的JS文件,並從其中加載了一切(甚至使用data-dojo-main更好)。然而,我試圖定義模塊(帶有服務器和客戶端代碼),這些模塊獨立工作並將它們自己添加到頁面中......所以,實際上是不好的做法,在應用程序頁面中有一堆文件,然後讓它們require()'正在運行的Dojo代碼?

謝謝!

Merc。

P.S. 如果你很好奇,https://github.com/mercmobily/hotplate ...這個項目在這裏發佈後發佈!

+0

你見過jingo.js嗎?http://code.google.com/p/jingo/ –

+0

是的,但它不在這個問題的範圍 - 在這裏,範圍是「Dojo」和AMD ... – Merc

+0

['dojo/ready']( http://dojotoolkit.org/reference-guide/1.8/dojo/ready.html)註冊一個函數,當DOM準備就緒時運行,**所有未完成的require()調用已經解析**,以及其他已註冊的函數與更高的優先級已經完成。 – phusick

回答

1

你可以儘可能多的要求每頁/文件/腳本,只要你願意。它的定義爲,應該每頁僅使用一次,因爲這是頁/腳本位置和模塊ID之間的關聯。 定義不嚴格用於小部件 - 它定義了一個模塊,它可以是一個函數,構造函數(類)一個單例對象,或者只是做一些工作而不返回任何東西。

要求是異步的;因此,其時觸發所有TEH依賴性已完成加載回調方法:

require(modules, callback); 

道場/就緒基本上是「塊」的基礎。回調將不會觸發,直到DOM已準備就緒,所有依賴項都已加載。它不是基於頁面的,也不是全局的 - 如果第一個需求等待DOM,那麼很有可能在第一個需求之前觸發第二個需求。

相關問題