Comment utiliser le domReady requireJS plugin correctement

Voici mon main.js avant d'utiliser domReady:

require.config({
  paths : {
      loader : 'libs/backbone/loader',
      jQuery : 'libs/jquery/jquery-module',
      Underscore : 'libs/underscore/underscore-module',
      Backbone : 'libs/backbone/backbone-module',
      templates : '../Templates'
  }
});

require([ 'app' ], function(app) {
  app.initialize();
});

Et app.js:

define([ 'jQuery', 'Underscore', 'Backbone', 'router',
    'services/Initializers/MainFrameInitializer',
    'services/Initializers/FlowsViewsInitializer',
    'services/Initializers/EditModuleInitializer',
    'services/Sandboxes/ModulesNavigationSandbox',
    'services/Sandboxes/ApplicationStateSandbox', 'DataModel/Constants' ],
    function($, _, Backbone, Router, MainFrameInitializer,
        FlowsViewsInitializer, EditModuleInitializer, ModulesNavigationSandbox,
        ApplicationStateSandbox, Constants) {
      var initialize = function() {
        //Pass in our Router module and call it's initialize function
        MainFrameInitializer.initialize();
        FlowsViewsInitializer.initialize();
        EditModuleInitializer.initialize();
        ApplicationStateSandbox.startCheckStatus();
        ModulesNavigationSandbox.navigate(Constants.Modules.Home);
        //Router.initialize();
      };

      return {
        initialize : initialize
      };
    });

Tout fonctionne très bien jusqu'à ce que je optimiser le projet. J'ai compris, que commence le script à exécuter avant que le DOM est prêt, quelque chose qui n'était pas le cas avant l'optimisation. De toute façon, je souhaite utiliser le domReady plugin assurez-vous que le DOM est chargé en premier.

Mais, apparemment, je n'ai aucune idée de comment le faire correctement. Voici la nouvelle version de main.js:

require.config({
  paths : {
      loader : 'libs/backbone/loader',
      jQuery : 'libs/jquery/jquery-module',
      Underscore : 'libs/underscore/underscore-module',
      Backbone : 'libs/backbone/backbone-module',
      templates : '../Templates'
  }
});

require([ 'domReady', 'app' ], function(domReady, app) {
  domReady(app.initialize);
});

Très soigné et très mal, parce que app est chargé en parallèle avec domReady avant que le DOM est prêt.

Comment puis-je résoudre ce problème?

Grâce.

MODIFIER

Je crois que j'ai compris notre problème. Le constructeur fonctions de la app dépendances ne doit pas exécuter n'importe quel DOM dépendant de code. Ils devraient juste retour des fonctions, la capture de la DOM dépendante de la logique. Cette logique doit être exécuté à partir de app.initialize, qui est garanti pour être exécuté lorsque le DOM est prêt.

Pourquoi est-il mauvais pour domReady et app d'être chargés en parallèle? Vous ne invoquer code de app lorsque le DOM est prêt. Ou ai-je mal compris?
Il est possible que c'est moi qui comprend mal comment la substance fonctionne. Chargement app implique le chargement de l'ensemble de l'application des dépendances (et il y en a quelques-uns), alors ces dépendances sont invoqués et les résultats sont transmis à l'application en usine de la méthode, qui renvoie le app lui-même. Si je comprends bien, les dépendances de app sont exécutés en parallèle avec domReady, ce qui signifie qu'ils peuvent s'exécuter avant que le DOM est chargé complètement.
Rien de pistes, à moins que votre usine de la fonction que vous passez à define() exécute le code. Généralement, l'usine de la fonction crée un objet avec des méthodes qui peuvent être appelées à un certain moment dans l'avenir (vous avez fait cela). Ainsi, même si un appel à define() va exécuter la fonction de fabrication, vous ne faites réel application de travailler quand vous le souhaitez. Comme vous l'avez fait en passant app.initialize à la domReady fonction. Il semble bien pour moi.
J'ai édité mon post. C'est ce que tu veux dire?

OriginalL'auteur mark | 2012-02-20