【问题标题】:Google map contained in meteor Template is rendered twice流星模板中包含的谷歌地图被渲染两次
【发布时间】:2012-11-23 10:24:49
【问题描述】:

我有以下模板:

<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() 运行)。它既显示在控制台日志中(此处未显示记录代码),也可以从闪烁一次的地图中看到(这是不可接受的)。

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

  1. 模板被渲染,$('#map_canvas') 生成为一个简单的 div 元素(未附加地图);
  2. google map api返回aync-ly并修改$('#map_canvas')
  3. Meteor 不知何故检测到更改,尽管有 {{#isolate}},但仍决定再次渲染整个模板(这显示在日志中);
  4. Template.test.rendered 内再次调用initialize()。

我的问题:

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

3 个问题,非常感谢!

【问题讨论】:

  • 您好,您是如何设法以正确的顺序包含您的 google maps api 外部文件的?我把它放在 但是当我调用它时它抱怨它不存在..

标签: google-maps-api-3 meteor


【解决方案1】:

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

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

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

【讨论】:

  • “评论只能在 5 分钟内编辑” - 抱歉。谢谢你的回答。我终于有机会测试这个了。 {{#contant}} 也不起作用。包含test 的外部模板:(我用一个简单的外部模板进行了测试): 所以我怀疑是外部模板导致了这种情况。
  • 请注意,{{#constant}} 模板确实会被重新渲染(即,rendered 与助手一起被调用)。但是,它们不会被替换,因此第一次放在那里的任何东西都会保留下来。你只需要在回调中小心一点。我会更新我的答案。
  • 得到你的答案更新。谢谢。所以我必须把rendered 中的注释块放在那儿。我实际上是在寻找类似first_rendered 的东西来避免这个样板。我试过created,但在此之前是一个回调。
  • 是的,我认为你需要这样的东西。
猜你喜欢
  • 1970-01-01
  • 2016-01-26
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多