2013-05-27 55 views
6

有幾個模塊頁:所有requirejs模塊後運行的動作被加載

// module 1 
require(['signalr'], function(s) { 
    s.subscribe('myhub1', function() { /* some code */ }); 
}); 

// module 2 
require(['signalr'], function(s) { 
    s.subscribe('myhub2', function() { /* some code 2 */ }); 
}); 

而且有方法(所有的訂閱完成)被調用的所有模塊後,應調用:

require(['signalr'], fuinction (s) { s.connect(); }); 

的可能的解決方案是定義模塊和寫這樣的:

// module 1 
define('module 1', ['signalr'], function(s) { 
    s.subscribe('myhub1', function() { /* some code */ }); 
}); 

// module 2 
define('module 2', ['signalr'], function(s) { 
    s.subscribe('myhub2', function() { /* some code 2 */ }); 
}); 
require(['signalr', 'module 1', 'module 2'], fuinction (s) { s.connect(); }); 

但問題是,d ifferent頁都有不同的模塊,說:

page1.cshtml: 模塊1

page2.cshtml: 模塊1,模塊2

所以我不能寫: 要求(['signalr ','module 1','module 2'],函數{s.connect(); }); ,因爲模塊2可能沒有在page2.cshtml中定義。

+0

你能不能有條件地建立一個基於網頁的要求數組,然後運行通過需要的功能?這似乎是最完美的方式來實現這一點。 –

+0

Intresting ..我會嘗試你的建議。謝謝。 – Jekas

回答

3

最好的方法是有條件地構建一個數組並將其傳遞給require函數,然後在回調中運行完成,就像您在問題中提到的那樣。

var modulesToLoad = []; 

// Build the array 

require(modulesToLoad, function (s) { 
    s.connect(); 
}); 

如果由於某種原因,你不能聚集你的電話到一個單一的要求,你需要跟蹤模塊的加載並在完成所有已加載運行檢查,然後運行清理代碼

var checkIfLoaded = { 
    myhub1 : false, 
    myhub2 : false, 
    myhub3 : false 
} 

function checkIfReady(s) { 
    for (var prop in checkIfLoaded) { 
     if (! checkIfLoaded[prop]) { 
      return false; 
     } 
    } 

    // Completion code 
    s.connect(); 
} 

require(['myhub1'], function(s) { 
    checkIfLoaded.myhub1 = true; 
    checkIfReady(s); 
}); 

require(['myhub2'], function(s) { 
    checkIfLoaded.myhub2 = true; 
    checkIfReady(s); 
}); 

想到這些,你應該能夠建立一個要求陣列

+0

謝謝。我使用條件構建的依賴模塊數組的方法。 – Jekas