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.initialize()
C.initialize()
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();
});