继续我对Backbone.js的探索,我已经到达了一种情况,我想要以编程的方式实例化一个Backbone应用程序。这种情况发生在这样一种情况:整个站点/页面不是一个Backbone应用程序,而是一个模态被打开,然后填充(Backbone应用程序的基础结构),然后然后我想触发Backbone应用程序(当模态被打开时,它的JavaScript也被加载)。如果可能的话,我更喜欢"手动"实例化Backbone应用程序,也就是说,当它的脚本加载时,它不会自动执行。
我一直使用的典型的Backbone格式是这样的:
var myApp = (function($) {
var myModel = Backbone.Model.extend({
...
});
var modelInstance = new myModel({
...
});
var myView = Backbone.View.extend({
...
});
var viewInstance = new myView({
...
});
}
但是当脚本文件被加载时,上面的代码会自动执行,然后实例化的视图会尝试绑定/呈现到它们相关的DOM元素,等等。是否有一种方法可以推迟匿名函数的执行,以便我可以在模态准备时加载脚本,但随后在[稍微]晚一点触发骨干应用程序的命令?
你应该用init
方法把你的组件放到一个对象中,当你的模态对话框打开时,你可以调用这个对象。下面是一个结构示例:
window.App = {
Models: {},
Views: {},
Routers: {},
init: function () {
var app = new window.App.Routers.main;
Backbone.History.start();
return app;
}
};
window.App.Models.Foo = Backbone.Model.extend({
// ...
});
window.App.Views.FooView = Backbone.View.extend({
// ...
});
window.App.Routers.main = Backbone.Router.extend({
// ...
});
window.modalDialog.onOpen = function () {
window.app = window.App.init();
};
上面假设你有一个全局变量modalDialog
代表你的模态窗口,当窗口显示时调用它的onOpen
回调。