Rails 4 主干网的事件顺序 需要加载
Order of events for a Rails 4 Backbone Require loading
我有三个主要文件:
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
中声明的依赖项在没有路由器本身调用的情况下发生。换句话说,事件的顺序是:
- A 给出了一个控制台.log从正常
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()
部分中,它会导致它们加载,甚至在文件本身初始化之前? 如果我删除声明,它们将不会加载,但是当然,我无法引用它们以适当的路由手动初始化它们。
眼睛的文件(左边是上面的事件顺序):
应用.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
};
});
路由器.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 主 Application.html.erb 上,这是<head>
中的声明顺序:
<%= stylesheet_link_tag "application", :media => "all" %>
<%= requirejs_include_tag "application" %>
<%= javascript_include_tag "assets" %>
宝石文件:
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'
和 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)
您对模块初始化顺序的理解是正确的,但请查看视图模块文件的末尾(例如,下面的StageView
):
define([
...
], function(...) {
var StageView = Backbone.View.extend({
...
});
// A singleton
return new StageView();
});
除了仅定义视图类外,它还直接创建视图类的实例。这就解释了为什么在导入模块时调用视图的initialize()
(Backbone 从构造函数调用initialize()
)。它也是调用render()
的initialize()
方法(例如,请参阅stageView.js,第45行)。
我希望这能解开这个谜团。
相关文章:
- phoneGap/Cordova插件加载顺序/交易w/AdBlock
- InnerHTML创建问题,没有't加载顺序正确,可能存在处理问题
- 任何控制Javascript异步加载顺序的方法
- 可以在Rails4中更改JavaScript文件的加载顺序吗
- Knockout.JS加载顺序问题
- 我应该如何在JS中使用揭示模块模式,传递引用,并避免加载顺序问题
- 使用Sencha's app.json来管理Javascript加载顺序和依赖关系
- Javascript src加载顺序
- Rails 指定 JavaScript 文件的加载顺序
- 需要JS脚本加载顺序
- 除了JS,其他语言是否按加载顺序执行代码
- Coldfusion - CFIDE 脚本的加载顺序
- j查询图像预加载顺序
- 视图中的 JavaScript 错误 - 加载顺序
- 子模板JS资产加载顺序在播放中!框架
- JS加载顺序 - 滚动JS禁用,回调解决方案,或者更简单
- 页面加载顺序有问题 - 样式不适用
- 角度 - 脚本加载顺序
- HTML 在 Internet Explorer 中导入加载顺序
- 角度指令加载顺序