首先,我主要使用单页应用程序。
我通常是这样操作的:
// Main module
;(function($, win, undefined) {
var module = {
_currentPanel,
initialize: function() {
// all my global bindings here
},
// Only included to understand whats going on in the sub-module below
displayPanel: function(panelName) {
if (!!module._currentPanel) {
$(module._currentPanel)
.hide(0)
.triggerHandler('hide.panel');
}
module._currentPanel = panelName;
$(panelName)
.show(0)
.triggerHandler('show.panel');
},
};
$.extend("namespace", module);
})(jQuery, window);
// Sub modules
;(function($, win, undefined) {
var module = {
something: function() {
// ..nothing to see here, this is just how i construct my modules
}
};
// Event bindings specific to this module
$('#geo-panel').bind('show.panel', function() {
// wire up init() stuff
});
$('#geo-panel').bind('hide.panel', function() {
// wire up dispose() stuff
});
$.extend("namespace", module);
})(jQuery, window);
那么那里发生了什么?
我的主模块包含所有全局内容..这是合乎逻辑的 :) 使用我在加载页面时在某处调用的 initialize() 函数。这连接了我在所有页面(或本例中的视图)上有用的所有通用绑定/选择器。
然后,当我在应用程序中显示各种伪页面时,我的子模块将绑定到我触发的事件。他们都对 .triggerHandler() 做出反应,我使用了很多来能够在整个站点中分离我的逻辑。
displayPanel("#geo-panel");
displayPanel("#someother-panel");
然后将主模块和子模块都聚合成一个大的 js 文件。这里有一些多余的 $.extend() (我用它来动态创建命名空间),它允许我将所有内容拆分为自动构建的专用子模块(首选项、配置文件、搜索......)在应用程序构建时聚合。
但是,如果我没有使用单页应用程序,那么我会:
- 只需将所有引用从
#panel-geo
, 更改为更像#pageX #panel-geo
- 或为所有页面选择 1 个通用 js,为每个页面选择 1 个特定 js