我认为我以错误的方式解决这个问题。这就是我尝试做的而不是使用RequireJS或LABjs:
var APP = {};
APP._timers = {};
APP._timelines = {};
$.when(
$.getScript('/app/models/Timer.js'),
$.getScript('/app/models/Section.js'),
$.getScript('/app/collections/Timers.js'),
$.getScript('/app/collections/Sections.js'),
$.getScript('/app/views/SectionView.js'),
$.getScript('/app/views/APPView.js'),
$.Deferred(function(deferred){
$(deferred.resolve);
})
).done(function () {
alert('done');
console.log(APP.APPView);
var foo = new APP.APPView;
APP._timelines.main = new APP.Timers('main');
APP._timelines.branched = new APP.Timers('branched');
}).fail(function(){
alert('failed');
});
警告failed
,没有任何内容写入控制台。
如果我打开任何这些文件,请说APPView.js
并提醒文件顶部或底部的某些内容,我会看到它。这是该文件的一个示例:
APP.APPView = Backbone.View.extend({
el : $("#app-view"),
initialize : function () {
alert('App view initialized'); // Never gets called
this.sectionVew = new APP.SectionView();
}
});
alert('Inside APPView.js'); // gets called
答案 0 :(得分:2)
我认为这是失败的原因是因为您尝试在$.when
内加载所有脚本而不管理依赖项。 $.getScript
中的每一个都是异步的,并且它们不必按顺序完成。因此,如果您的视图在模型执行停止之前加载,那么它将尝试使用未定义的模型。
简而言之,要做到这一点,你必须要么:
答案 1 :(得分:1)
我不确定domReady延迟的实现,请尝试这种方式:
var APP = {};
APP._timers = {};
APP._timelines = {};
var domRdyDeferred = $.Deferred();
$(domRdyDeferred.resolve);
$.when(
$.getScript('/app/models/Timer.js'),
$.getScript('/app/models/Section.js'),
$.getScript('/app/collections/Timers.js'),
$.getScript('/app/collections/Sections.js'),
$.getScript('/app/views/SectionView.js'),
$.getScript('/app/views/APPView.js'),
domRdyDeferred
).done(function () {
alert('done');
console.log(APP.APPView);
var foo = new APP.APPView;
APP._timelines.main = new APP.Timers('main');
APP._timelines.branched = new APP.Timers('branched');
}).fail(function(){
console.log(arguments);
alert('failed');
});
重要的是要注意,它们可能无法按照您将其添加到$.when
的顺序完成