我猜你的问题是#mapCanvas
在您尝试访问它之前,它并不在 DOM 中,因此:
document.getElementById('mapCanvas')
会给你一个无用的null
。你需要等到#mapCanvas
在使用之前已在 DOM 中;你也不能做这样的事情:
map_canvas = this.$el.find('#mapCanvas')[0];
这将为您提供一个有效的 ID,但您会混淆 Google 地图功能,因为它没有大小,因此地图将呈现奇怪的效果。这会让您重新等待 DOM 中的所有内容,然后再绑定 Google 地图内容。
解决这个问题的一种方法是使用setTimeout延迟为零 https://stackoverflow.com/a/9145790/479863:
var _this = this;
setTimeout(function() { _this.renderMap() }, 0);
这看起来有点奇怪,但它确实有效,这个技巧基本上抛弃了你renderMap
调用浏览器的工作队列,一旦您将控制权返回给浏览器,它就会开始运行它。
您还可以使用_.defer http://underscorejs.org/#defer:
defer _.defer(function, [*arguments])
推迟调用function直到当前调用堆栈被清除,类似于使用设置超时时间延迟为 0。对于执行昂贵的计算或分块的 HTML 渲染而不阻塞 UI 线程更新很有用。
这可能是一个更好的选择,因为它使您的意图明确。