谷歌地图不适用于多视图?

时间:2015-05-26 14:20:37

标签: google-maps google-maps-api-3 multiviews

检查我对Google地图的理解:

我正在开发一个网页,为我的雇主的设施显示许多不同类型的信息。我一直在使用多视图,并根据用户输入(按钮工具栏)激活正确的视图。当我将视图添加到所选建筑物的地图时,我遇到了问题。我可以在用户导航到建筑地图视图时显示地图。但是当用户离开该视图时,地图api会给我错误

0x800a138f - JavaScript runtime error: Unable to get property 'offsetWidth' of undefined or null reference

据我了解,这是因为当另一个视图变为活动状态时,不再呈现包含地图的视图。 api正试图访问一个不再存在的对象。

我可以尝试清除对象 - 删除所有侦听器,删除对象,甚至删除包含它的div。但我刚刚阅读了how to destroy a map instance上的相关问题,并听取了Chris Broadfoot和Luke Mahe关于该主题的讨论。

据此,我的理解是google maps api不是为这种处理而设计的。因此,它实际上并不是设计为与多视图等兼容。

这是正确的吗?如果没有,我错过了什么?如果是这样,对于网络应用程序新手的任何建议,使用什么而不是多视图(我正在考虑面板并根据需要隐藏/显示)?

1 个答案:

答案 0 :(得分:0)

更新和答案... ... 我切换到使用多个面板并隐藏所有面板,除了具有用户选择使用的信息的面板。除非我执行以下两项操作之一,否则地图显示为空白:将地图设置为endRequest ...

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(myInitMap);

如果我理解正确,这意味着我的处理程序(myInitMap)会在每次回发后执行(映射重新创建)。此外,这似乎有点不稳定 - 有时IE会给我错误,我无法弄清楚模式或原因。 Chrome每次都可以正常工作。

另一种方法是不在任何特定事件上调用地图创建,而是从代码隐藏的page_load事件中注册我的map init脚本。我的面板和我的多视图已被包含在更新面板中,我需要在该更新面板下注册脚本...

ScriptManager.RegisterStartupScript(DataUpdatePanel, DataUpdatePanel.GetType(), "ShowGoogleMap", "myInitMap();", true);

这是因为我认为导致问题的是我的面板(以及我早期版本中的多视图)在UpdatePanel中。由于UpdatePanel执行了部分页面更新,因此地图创建脚本和API调用没有以正确的顺序发生。使用脚本管理器注册映射init脚基本上告诉它将它放在部分页面更新的正确位置(最后?)。

另外,我无法弄清楚如何更新地图。该脚本基本上每次都重新生成地图。我尝试保留一个指向地图的var指针,以便我可以测试是否已经创建了它,然后只是更新它,但这不起作用。我认为,UpdatePanel部分页面更新与整个页面刷新非常相似,但仅适用于UpdatePanel中包含的内容。因此,当部分更新发生时,先前的内容将被处理并重新创建,因此也必须重新创建地图。

如果有人不同地理解这一点,我会喜欢一些重定向。