2011-03-07 3 views
4

J'utilise RequireJS dans ASP.NET. Il existe un contrôle utilisateur qui inclut un fichier script et enregistre un script de démarrage afin de s'initialiser. Voici le code généré:Comment charger un script de manière synchrone avec 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> 

Le fichier myctrl.js ressemble à ceci:

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

Ainsi, le problème est que le script de démarrage passe avant la Le fichier myctrl.js a eu une chance de s'exécuter. Actuellement, l'appel require utilise une fonction de rappel, qui ne fonctionne évidemment que plus tard, et c'est le problème ... le script revient et le navigateur continue jusqu'au script de démarrage avant la création de MyCtrl.

J'ai essayé simplement d'appeler require(['script/dep1', 'script/dep2']); en haut du fichier, mais cela ne bloque pas non plus, et le script échoue car les dépendances n'ont pas encore été chargées. Les dépendances sont des modules, en passant, par exemple. ils utilisent define().

Existe-t-il un moyen de charger un fichier de script de manière synchrone avec RequireJS? La documentation de l'API indique que "Utiliser RequireJS dans un environnement JavaScript côté serveur avec un chargement synchrone devrait être aussi simple que redéfinir require.load()", mais je n'ai aucune idée de ce que cela signifie.

Des suggestions?

Répondre

2

Je suppose que l'étiquette de script pour require.js est au-dessus du contenu que vous mentionnez. Si c'est le cas, alors je convertirais myctrl.js en un module (utilisez "define ('myctrl', ....)" au lieu de "require (.." à l'intérieur), puis dans le contenu du tag de script inline comme:

<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> 

Je ne suis pas familier avec ASP.NET, donc je ne sais pas s'il est correct de faire ces appels Sys.Application dans un rappel qui peut tirer après DOMContentLoaded, mais ce qui précède est l'idée générale

Il n'est pas possible de charger de manière synchrone un script dans le navigateur avec RequireJS, il faut utiliser une méthode de rappel comme ci-dessus L'information require.load() était destinée aux développeurs qui veulent faire fonctionner des adaptateurs RequireJS synchronisés environnements (essentiellement des environnements JS non de navigateur)

+0

Donc, faites toute l'initialisation de manière asynchrone, hein? Semble raisonnable, mais puis-je compter sur le DOM ayant fini le chargement au moment où myCtrl1_init déclenche? – alekop

+0

@jburke, cela fonctionne, merci. – alekop

+0

Si vous voulez être sûr que myCtrl1_init est déclenché après le DOM, enveloppez le code avec require.ready(). require (["myctrl"], function() {require.ready (function() {fonction myCtrl1_init ..... – jrburke

Questions connexes