Javascript名称空间和条件包含

时间:2011-08-25 15:47:53

标签: javascript ruby-on-rails

我用这种方式组织了一些js文件(参见source):

  • gmaps4rails.base.js:包含所有逻辑

    • gmaps4rails.googlemaps.js:包含函数

    • gmaps4rails.bing.js:包含与上一个文件同名的功能

基本上,base调用了createMarkers()googlemaps中的bing

从现在起,我只加载gmaps4rails.googlemaps.jsgmaps4rails.googlemaps.js中的一个,具体取决于我需要的地图API,因此效果很好。

现在我希望能够加载所有文件(并将它们分开)但当然只包含所需地图API的代码。

基本上我想的是:

if desiredApi == "googlemaps"
   include GoogleMapsNameSpace content in BaseNameSpace

提前致谢。

2 个答案:

答案 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.1Asynchronous Module Definition (AMD) API这样做。有许多异步加载器的实现,如this Google spreadsheet中所列。其中,其中一些符合AMD标准,例如:

这个blog entry对这个话题进行了很好的讨论。

另见SO帖子:Namespace a dynamically loaded javascript file's contents