Donc, si j'ai un module comme:
//test1.js define([], function() { var counter = 0; return { increment: function() { counter++ } }; });
Requirejs va charger ce module une fois (pour être conscient des variables locales de ce module) et jamais plus? Le compteur variable sera actif à travers la fermeture à partir de l'objet de retour (grâce à la fonction d'incrémentation)?
Qu'en est-il de l'exemple suivant?
//test2.js define([], function() { var value = 10; document.getElementById('asd').addEventListener('mousedown', function(e) { value = Math.random(); }); return value; });
Avec cette structure de code, cet événement ne se déclenche jamais parce que requirejs va charger / exécuter ceci une seule fois? La valeur exportée ici sera de 10 et ne pourra-t-elle pas être modifiée? Donc, pour cet exemple, je n'ai qu'une seule solution et renvoie une fonction à partir de ce module (quand je veux que l'effet "exécute ce module plus d'une fois" soit définitivement)?
C'est donc ce moyen correct de le faire?
//test3.js define([], function() { return function() { return Math.random(); }; }); //test4.js define(['test3'], function(test) { document.getElementById('asd').addEventListener('mousedown', function(e) { alert(test()); }); });
Fell free pour publier tout autre piège que vous trouviez intéressant sur Requirejs.
Que diriez-vous quelque chose comme ça:
define([], function() { var value = 10; document.getElementById('asd').addEventListener('mousedown', function(e) { value = Math.random(); }); return { getValue: function(){return value;} }; });
La valeur de la variable conservera son état interne à la fonction de définition, mais quand elle est retournée par définir le résultat est passée par valeur (non par ref) qui ne sera jamais mise à jour.
Au lieu de cela, vous pouvez renvoyer une méthode qui vous procurera la valeur actuelle de votre valeur lorsque vous l'appelez. Cela signifie que vous pouvez récupérer la valeur actualisée
À la fin, il est très facile à comprendre. Tout nécessiteJs est, est d'évaluer la fonction passée et de retourner le même résultat à chaque module qui l'exige. Donc, si vous avez besoin du résultat du dernier mousedown, vous devez renvoyer soit un objet contenant la valeur, soit une fonction qui renvoie la valeur:
define([], function () { var result = {value:10}; //the listener is bound when the module loads, maybe you should wrap this in domLoad listener as well document.getElementById('asd').addEventListener('mousedown', function (e) { result.value = Math.random(); }); return result; }); define(['test2'], function (test2) { var value = test2.value; }); define([], function () { var result = {value:10}; document.getElementById('asd').addEventListener('mousedown', function (e) { result.value = Math.random(); }); return result; }); define(['test2'], function (test2) { var value = test2(); });