2014-03-12 52 views
5

我使用的是AMD模块模式,到现在为止,它已经比较简单的隐藏,否则这将是全球对象的对象m好奇是否可以用谷歌的全局对象来做类似的事情(我想他们真的是这些地图和几乎所有的API都使用它们)。隐藏全球window.google.maps与AMD

只是做我以前做的事实际上打破了代码,因为。看起来在内部,谷歌自动引用自身的动态脚本调用全局window.google对象。

我打算继续调查,但很好奇你的想法!

谢谢。

+0

取决于哪些谷歌的东西 - 在iFrame中加载? –

+0

@JeremyJStarcher以谷歌地图为例。我想参考maps API,但是我想用AMD模式来做。所以一个iframe在这里似乎很棘手,但我不太熟悉如何有效地使用它们,也许你可以说一些光。 –

回答

1

如果您使用RequireJS作为AMD装载机,您可以使用config shims包裹非AMD模块,表达自己的依赖关系,执行任何必要的初始化(你明确自己的全球性的,如果脚本支持的话)并出口其全球。

对于谷歌地图,这将是这个样子(没有,你可能不希望清除谷歌全球变量):

require.config({ 
    paths: { 
     "maps": "https://maps.googleapis.com/maps/api/js?key=API_KEY" 
    }, 
    shims: { 
     "maps": { 
      exports: "google.maps" 
     } 
    } 
}); 

之后,你可以用这个作为一个经常性AMD模块:

require(["maps"], function(maps) { 
    var map = new maps.Map(document.getElementById("map-canvas"), ....); 
    ... 
}); 
+0

谢谢。我确实使用了RequireJS。这不仅仅是我在代码中手动完成的标准方法吗?它仍然离开window.google,这可能是我必须忍受的事情,我只是想完全理解。 –

+0

这与代码中所做的几乎完全相同,除了它还允许您指定先决条件。这对Google地图来说不是问题,但对于希望先加载另一个脚本的脚本来说,这可能是个问题。我不确定删除Google全局变量是否安全,或者地图脚本是否依赖它的存在。如果你想删除它,你可以通过在垫片中指定一个init()方法来实现。 –

+0

此外,您的jQuery示例实际上并未从全局范围中删除$变量(您正在清除本地$)。 FWIW,jQuery 1.7和更高版本已经可以作为AMD模块加载(你可以谷歌它)。在任何情况下,删除jQuery全局$的正确方法是调用jQuery.noConflict()。 –