我用这种方式组织了一些js文件(参见source):
gmaps4rails.base.js
:包含所有逻辑
gmaps4rails.googlemaps.js
:包含函数
gmaps4rails.bing.js
:包含与上一个文件同名的功能
基本上,base
调用了createMarkers()
和googlemaps
中的bing
。
从现在起,我只加载gmaps4rails.googlemaps.js
和gmaps4rails.googlemaps.js
中的一个,具体取决于我需要的地图API,因此效果很好。
现在我希望能够加载所有文件(并将它们分开)但当然只包含所需地图API的代码。
基本上我想的是:
if desiredApi == "googlemaps"
include GoogleMapsNameSpace content in BaseNameSpace
提前致谢。
答案 0 :(得分:2)
如果我理解正确,您只是希望能够使用谷歌地图API或bing API或其他基于用户选择(或其他一些标准)?为此,您不必尝试将正确的API合并到基础对象中,为什么不从基础对象中引用“mapService”并根据您想要的标准选择mapService?
这样的事情:
Map = function(service, canvasId) {
var mapService = MapServices[service];
return {
initialize: function() {
var theMap = mapService.createMap();
mapService.render(canvasId);
}
// more functionality for your base object (that the outside world calls) goes here
}
}
var MapServices = MapServices || {};
MapServices.google = {
createMap: function() {},
render: function(canvas) {
$("#"+canvas).html("I'm a google map");
},
createMarker: function(args) {}
// all your map functionality goes here calling google specific functions
};
// this could be in a different js
MapServices.bing = {
createMap: function() {},
render: function(canvas) {
$("#"+canvas).html("I'm a bing map");
},
createMarker: function(args) {},
// all your map functionality goes here calling bing specific functions
}
$(function() {
var theMap = new Map("google", "theDiv");
theMap.initialize();
});
这是你想要做的吗?
希望这有帮助
答案 1 :(得分:2)
我认为你正在寻找某种异步加载器。 CommonJS提出Modules 1.1和Asynchronous Module Definition (AMD) API这样做。有许多异步加载器的实现,如this Google spreadsheet中所列。其中,其中一些符合AMD标准,例如:
这个blog entry对这个话题进行了很好的讨论。
另见SO帖子:Namespace a dynamically loaded javascript file's contents