我有以下模板:
<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 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_canvas')
生成为一个简单的 div 元素(不附加地图);
- 谷歌地图API返回异步并修改
$('#map_canvas')
;
- 不知怎的,Meteor 检测到了这种变化,尽管
{{#isolate}}
,决定再次渲染整个模板(这在日志中显示);
- 再次调用initialize()
Template.test.rendered
.
我的问题:
- why?
- 如果发生了这种情况,为什么 Meteor 只渲染两次,而不是无限次?
- 解决方案?
3个问题,非常感谢!
由于外部上下文包含,模板可能被渲染两次{{> test}}
正在重新渲染。发生这种情况的原因有多种,但通常只是它最初在没有订阅数据的情况下呈现,然后在数据加载后再次呈现。
不管怎样,在你的具体情况下,我认为你想要的是{{#constant}}
围绕你的谷歌地图的包装,而不是{{#isolate}}
.
NOTE: {{#constant}}
areas do如果(无论出于何种原因)周围的上下文被重新渲染,则重新渲染。然而,新版本在 DOM 中被丢弃而不是被替换。所以你要小心rendered
回调只做某事第一次.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)