google-maps-api-3 - meteor 模板中包含的谷歌地图被渲染两次

标签 google-maps-api-3 meteor

我有以下模板:

<template name="test">
  {{#isolate}}
    <div id="map_canvas" style="width:50%; height:50%"></div>
  {{/isolate}}
</template>

在我的 test.js 中(来自 https://developers.google.com/maps/documentation/javascript/tutorial#HelloWorld ):

function initialize(){
  var mapOptions = {
    center: new google.maps.LatLng(-34.397, 150.644),
    zoom: 8,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  };
  var map = new google.maps.Map($("#map_canvas")[0], mapOptions);
}

Template.test.rendered = function(){
    initialize();
  //*** The following is the workaround I am using:***
  // if (! this.initialized){
  //   initialize();
  //   this.initialized = true;
  // }
};

问题是:如果没有注释代码部分中显示的解决方法,模板总是会渲染两次(当运行initialize() 时)。它既显示在控制台日志中(此处未显示日志记录代码),也从 map 闪烁一次可见(这是 Not Acceptable )。

我猜原因是发生了以下事件:

  1. 模板已渲染,$('#map_canvas') 生成为简单的 div 元素(未附加 map );
  2. Google map API 返回 aync-ly 并修改 $('#map_canvas');
  3. 不知何故,Meteor 检测到了变化,并且不顾 {{#isolate}},决定再次渲染整个模板(这在日志中显示);
  4. Template.test.rendered 中再次调用 initialize()。

我的问题:

  1. 为什么?
  2. 如果确实发生了这种情况,为什么 Meteor 只渲染两次,而不是无限次?
  3. 解决方案?

三个问题,非常感谢!

最佳答案

由于外部上下文包含 {{> test}},模板可能被渲染两次正在重新渲染。发生这种情况的原因有多种,但通常只是它最初在没有订阅数据的情况下呈现,然后在数据加载后再次呈现。

无论如何,在你的具体情况下,我认为你想要的是 {{#constant}}包装你的谷歌地图,而不是 {{#isolate}} .

注意:{{#constant}}如果(无论出于何种原因)周围的上下文被重新渲染,区域确实会被重新渲染。然而,新版本在 DOM 中被丢弃而不是被替换。所以请小心你rendered仅在第一次执行某些操作的回调。

关于google-maps-api-3 - meteor 模板中包含的谷歌地图被渲染两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13320428/

相关文章:

javascript - 使用 radio 启用/禁用 meteor 复选框,使用复选框显示/隐藏

javascript - 我应该每次都使用 Meteor.userId() 还是应该将它存储在语言环境变量中?

javascript - 尝试从 npm 永久安装

meteor - 如何使用 mongoimport 中的 ObjectID?

javascript - 使用meteor在if语句中导出

ruby-on-rails-3 - 将 div(谷歌地图)设置为 100% 高度,以便填充 Twitter Bootstrap 中导航栏和页脚之间的空白

javascript - 使用图层/标记打印谷歌地图 div

button - 从自定义按钮启动多边形绘制

google-maps-api-3 - 在绘图模式下禁用拖动 Google map

php - Google Maps AP v3 I - 尝试使用 jQuery $.ajax 动态添加标记