【问题标题】:gmaps4rails not rendering in specified div idgmaps4rails 未在指定的 div id 中呈现
【发布时间】:2018-12-09 20:17:58
【问题描述】:

我在 Active Admin 中使用 Gmaps4Rails(Google Maps for Rails)。到目前为止一切都很好,除了我不得不在同一个显示页面上添加多个地图。

gem 'gmaps4rails', '~> 2.1', '>= 2.1.2'

我将脚本的导入提取到一个我在显示视图中只调用一次的 html,因此我没有收到错误:

/views/admin/_map_include_scripts.html.erb

<script src="//maps.google.com/maps/api/js?key=<%= ENV['GOOGLE_KEY'] %>"></script>
<script src="//cdn.rawgit.com/mahnunchik/markerclustererplus/master/dist/markerclusterer.min.js"></script>
<script src='//cdn.rawgit.com/printercu/google-maps-utility-library-v3-read-only/master/infobox/src/infobox_packed.js' type='text/javascript'></script>

然后在节目中我做:

div id: 'map' do
  render '/admin/map_include_scripts'
  markers = DeliveryMarkersService.new(delivery).orders_markers
  render '/admin/map_scripts', markers: markers, map_div_id: 'map'
end

views/admin/_map_scripts.html.erb 我有:

<script>
  handler = Gmaps.build('Google');
  handler.buildMap({ provider: {}, internal: { id: '<%= map_div_id %>' }}, function(){
    markers = handler.addMarkers(<%=raw markers.to_json %>);
    handler.bounds.extendWith(markers);
    handler.fitMapToBounds();
    handler.getMap().setZoom(15);
  });
</script>

到目前为止,它工作得很好!我看到了地图,标记,一切。

现在我想添加第二个 div 和第二个地图 所以首先我尝试将第一个 div 更改为以下内容,以验证我可以告诉 Gmaps 在哪个 div 中显示它

div id: 'map2' do
  render '/admin/map_include_scripts'
  markers = DeliveryMarkersService.new(delivery).orders_markers
  render '/admin/map_scripts', markers: markers, map_div_id: 'map2'
end

但是地图没有渲染!控制台上没有错误。 如果我确实发送了一个无效的 id(不存在的 div id),我会收到一个错误。

有人知道发生了什么吗?

【问题讨论】:

  • 将第二张地图放入视图中是否有效?
  • 如果我使用 map2 作为 div 的 id 和名称,则不会

标签: ruby-on-rails gmaps4rails


【解决方案1】:

您的问题可能与在同一页面中执行两次render '/admin/map_include_scripts' 有关,这会触发地图和叠加 API 的另一次加载。当您在第一个加载后执行此操作时,您的 render '/admin/map_scripts', markers: markers, map_div_id: 'map2' 可能会在完全加载库之前执行地图渲染 JS。尝试将render '/admin/map_include_scripts' 移动到每个 div 映射循环之外的公共 sn-p。 这样,库仅在您无需等待 API 的第二次加载时才会加载。

render '/admin/map_include_scripts'
div id: 'map' do
  markers1 = DeliveryMarkersService.new(delivery1).orders_markers
  render '/admin/map_scripts', markers: markers1, map_div_id: 'map'
end

div id: 'map2' do
  markers2 = DeliveryMarkersService.new(delivery2).orders_markers
  render '/admin/map_scripts', markers: markers2, map_div_id: 'map2'
end

【讨论】:

  • 感谢您的回答! Try moving render '/admin/map_include_scripts' to a common snippet, outside each div map loop 是什么意思。我将它移到第一个 div 之前,一个未注释的第二个 div,并从 div 内部删除了包含。我从 addMarker 函数的一行中得到Uncaught TypeError: Cannot read property 'addMarker' of undefined(集群未定义)。有什么想法吗?
  • 嗯,这就是我所做的,但没有奏效。错误是我放在上面的那个
  • 您可能遇到了 JS 订单问题,或者handler = Gmaps.build('Google'); 可能无法执行两次。尝试更改顺序并在/admin/map_include_scripts 上初始化handler
  • 还是不行。观察仅使用 1 个 div,如果我更改 div id 并且参数通过,我看不到任何地图。所以唯一有效的 id 是map。好奇怪
【解决方案2】:

您能否具体说明“地图未渲染”是什么意思?它在页面或 DOM 上不可见?您是否检查过开发人员工具中的源代码/DOM?如果您没有收到错误,则它可能会呈现但无法正确显示,例如它的宽度/高度设置为 0?

【讨论】:

  • 其实你是对的。宽度/高度设置为 0。在我的 scss 中,我已定义 #map 将具有一定的宽度/高度。但是在更改 div 的 id 时,我没有意识到现在这个 css 规则不会被应用,并且 div 没有任何宽度。我觉得我好笨。对不起,谢谢!
  • 很高兴听到这个消息,没问题 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多