Javascript Rails 4主干需要加载的事件顺序

Javascript Rails 4主干需要加载的事件顺序,javascript,ruby-on-rails,ruby-on-rails-4,backbone.js,requirejs,Javascript,Ruby On Rails,Ruby On Rails 4,Backbone.js,Requirejs,我有三个主要文件: A) application.js // This resides in rails land at app/assets/javascripts/application.js B) SOF.js // This resides in rails land at app/assets/javascripts/SOF.js C) router.js // This resides in backbone land at app/ass

我有三个主要文件:

A) application.js  // This resides in rails land at    app/assets/javascripts/application.js
B) SOF.js          // This resides in rails land at    app/assets/javascripts/SOF.js
C) router.js       // This resides in backbone land at app/assets/javascripts/backbone/routers/router.js
我想知道为什么
router.js
中声明的依赖项没有在路由器本身中调用就发生了。换句话说,事件的顺序是:

  • 在正常的
    require.js
    define()
  • 然后是B
  • 然后是C
  • 那么所有C的依赖项都是在函数init中定义的
  • 然后A开始初始化,在这里它调用
    B.initialize()
  • 然后B开始初始化它调用的
    C.initialize()
  • (a) 然后C开始初始化,(b)识别路由,并遵循适当的路由器方法,完成其路由器方法调用(即使没有)
  • 然后C完成初始化,并将控制权传递回B
  • 然后B完成初始化,并将控制权传递回A
  • 然后A完成初始化,不再有日志
  • 我的理解是App.js(A)应该初始化SOF.js(B),后者在router.js(C)中初始化路由器,然后路由器应该识别路由,遵循适当的路由,并在那里创建任何模型/集合/视图

    为什么仅仅通过将文件包含在require.js方法声明的
    define()
    部分中,就可以在文件本身初始化之前加载它们?如果我删除了声明,它们将不会加载,但是当然,我不能引用它们,以在适当的路由中手动初始化它们

    适合您眼睛的文件(上面事件的顺序在左边):
    Application.js:

    1-  console.log('Application.js: Started');
        require([      'SOF'    ],
          function(SOF){
    5-    console.log("Application.js: initializing SOF...");
          SOF.initialize(App.songs); //App.songs is an object that contains the data from the Rails DB
    10-   console.log("Application.js: SOF_Application Fully initialized");
        });
    
    SOF.js:

    2- console.log('SOF.js: Started');
       define([
         'jquery',
         'underscore',
         'backbone',
         'backbone/routers/router',
         'd3',
         'jquery-ui'
       ], function($, _, Backbone, Router, d3, $){
         var initialize = function(options){
    6-     console.log('SOF.js: In Initialize, initializing Router:');
    6-     console.log('SOF.js: options : ', options);
           Router.initialize(options);
    9-     console.log('SOF.js: Finished initializing');
         }
         return {
           initialize: initialize
         };
       });
    
    router.js:

    3- console.log('Backbone Router started');
       define([
         'jquery',
         'underscore',
         'backbone',
    4-   'backbone/relevantModels....',       // Will init just by being here
    4-   'backbone/relevantCollections....',  // If I remove it from here, and of course its matching name in the following function formal parameter, it will not init/render
    4-   'backbone/relevantViews....'
       ], function($, _, Backbone, RelevantModels, RelevantCollections, RelevantViews){
         var BBRouter = Backbone.Router.extend({
           routes: {
             'new'       : 'newSong',
             '.*'        : 'newSong'
           },
           newSong: function(){
    7b       console.log('BB routes => new : newSong');
             // THESE ARE ALL COMMENTED OUT (VERIFIED no caching problems) but still init/render because they are declared above
             // And if I remove the declaration above, I can't call new RelevantView() since it won't know what RelevantView is
             // top side
             // RelevantView.render();
             // middle
             // RelevantView.render();
             // bottom
             // RelevantView.render();
    7b       console.log('BB routes: newSong Finished');
           }
         });
         var initialize = function(options){
    7a     console.log("BB Router => Initializing...");
           var bb_router = new BBRouter;
           window.router = bb_router;  // attach it to the window for debugging
    8-     console.log('BB Router => Initialized');
           Backbone.history.start({root: '/songs/#new'});
         };
         return {
           initialize: initialize
         };
       });
    
    还要注意,在Rails main Application.html.erb上,这是
    中的声明顺序:

    和Gemfile.lock

    GIT
      remote: https://github.com/codebrew/backbone-rails.git
      revision: 4c1dfba7b4f2a989bd0dbc95d5afd3fc762a0b6d
      tag: v1.1.2
      specs:
        rails-backbone (1.1.2)
          coffee-script
          ejs
          jquery-rails
          railties
    GIT
      remote: git://github.com/jwhitley/requirejs-rails.git
      revision: f2330104aeca4d193fd5680a22ae7eee85d814b5
      specs:
        requirejs-rails (0.9.1)
          railties (>= 3.1.1, < 4.1)
    
    GIT
    远程:https://github.com/codebrew/backbone-rails.git
    修订:4c1dfba7b4f2a989bd0dbc95d5afd3fc762a0b6d
    标签:v1.1.2
    规格:
    铁路主干线(1.1.2)
    咖啡剧本
    ejs
    jquery rails
    栏杆
    吉特
    远程:git://github.com/jwhitley/requirejs-rails.git
    修订:f2330104aeca4d193fd5680a22ae7eee85d814b5
    规格:
    requirejs rails(0.9.1)
    钢轨(>=3.1.1,<4.1)
    
    您对模块初始化顺序的理解是正确的,但请查看查看模块文件的末尾(例如下面的
    StageView
    ):

    除了定义一个视图类之外,它还直接创建它的一个实例。这解释了为什么在导入模块时调用视图的
    initialize()
    (主干从构造函数调用
    initialize()
    )。它也是调用
    render()
    (例如,请参见)的
    initialize()
    方法


    我希望这能解开谜团。:-)

    如果没有至少一个
    “relevantview”
    模型的代码,很难回答此问题。也许他们的
    define
    方法包含您遗漏的初始化逻辑?可以在上查看项目。具体来说,所有视图都位于,我将查看stageview和conductorview,因为它们是两个主要视图(stage view是保存所有剩余子视图的视图)。如果我能提供更多帮助,请告诉我。以下是一个工作的基本plnkr:。以下是github代码的工作版本:
    gem 'rails-backbone', git: 'https://github.com/codebrew/backbone-rails.git', tag: 'v1.1.2'
    gem 'requirejs-rails', git: 'git://github.com/jwhitley/requirejs-rails.git'
    
    GIT
      remote: https://github.com/codebrew/backbone-rails.git
      revision: 4c1dfba7b4f2a989bd0dbc95d5afd3fc762a0b6d
      tag: v1.1.2
      specs:
        rails-backbone (1.1.2)
          coffee-script
          ejs
          jquery-rails
          railties
    GIT
      remote: git://github.com/jwhitley/requirejs-rails.git
      revision: f2330104aeca4d193fd5680a22ae7eee85d814b5
      specs:
        requirejs-rails (0.9.1)
          railties (>= 3.1.1, < 4.1)
    
    define([
      ...
    ], function(...) {
      var StageView = Backbone.View.extend({
        ...
      });
    
      // A singleton
      return new StageView();
    });