2011-03-07 120 views
4

我使用RequireJS在ASP.NET。有一個用戶控件包含一個腳本文件,並註冊一個啓動腳本以便自行初始化。下面是生成的代碼:如何同步加載腳本與RequireJS

<script src="script/UserControls/myctrl.js" type="text/javascript"></script> 

...

<script type="text/javascript"> 
function myCtrl1_init() { 
    // initialize control 
    // *JS ERROR* because myctrl.js hasn't run yet 
    Sys.Application.remove_load(myCtrl1_init); 
} 
Sys.Application.add_load(myCtrl1_init); 
</script> 

的myctrl.js文件看起來是這樣的:

require(['script/dep1', 'script/dep2'], function(dep1, dep2) {  
    MyCtrl = function() { 
    }; 
    MyCtrl.init = function(id) { 
     dep1.doSomething(); 
    } 
}; 

所以,問題是,啓動腳本之前運行myctrl.js文件有機會運行。目前,require調用使用回調函數,顯然直到後來才運行,這就是問題......腳本返回並且瀏覽器在MyCtrl創建之前繼續執行啓動腳本。

我試圖簡單地調用require(['script/dep1', 'script/dep2']);在文件的頂部,但這並不阻止或者,因爲依賴尚未加載腳本失敗。順便說一下,依賴關係是模塊。他們使用define()

有沒有辦法與RequireJS同步加載腳本文件? API文檔指出:「在具有同步加載的服務器端JavaScript環境中使用RequireJS應該與重新定義require.load()一樣簡單,但我不知道這意味着什麼。

有什麼建議嗎?

回答

2

我承擔require.js腳本標籤是你提到上面的內容。如果是這樣,那麼我會將myctrl.js轉換爲一個模塊(使用「define('myctrl',....)」而不是「require(..」),然後在內聯腳本標記內容中做一些事情像:

<script type="text/javascript"> 
require(["myctrl"], function() { 
    function myCtrl1_init() { 
     // initialize control 
     // *JS ERROR* because myctrl.js hasn't run yet 
     Sys.Application.remove_load(myCtrl1_init); 
    } 
    Sys.Application.add_load(myCtrl1_init); 
}); 
</script> 

我不熟悉ASP.NET,所以我不知道,如果它是確定做回調那些Sys.Application電話DOMContentLoaded之後可能會觸發,但上面的總體思路。

無法在瀏覽器中使用RequireJS同步加載腳本,需要使用類似上述的回調方法。require.load()信息適用於想要使RequireJS適配器同步運行的開發人員環境(基本上是非瀏覽器的JS環境)

+0

那麼,異步完成整個初始化,呃?似乎是合理的,但我可以指望在myCtrl1_init觸發時完成加載的DOM嗎? – alekop 2011-03-09 07:44:58

+0

@jburke,這個作品,謝謝。 – alekop 2011-03-10 08:24:02

+0

如果您想確保在DOM準備好後myCtrl1_init被觸發,請使用require.ready()包裝代碼。需要([「myctrl」],函數(){require.ready(函數(){函數myCtrl1_init ..... – jrburke 2011-03-12 06:39:27