次のテンプレートがあります。
<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;
// }
};
問題は、コメント付きのコード セクションに示されている回避策がないと、テンプレートが常に 2 回レンダリングされる (initialize() が実行されるため) ことです。これは、コンソール ログ (ログ コードはここには示されていません) に表示されるだけでなく、1 回点滅するマップからも表示されます (これは受け入れられません)。
その理由は、私が推測しているのは、次のイベントの発生によるものです。
- テンプレートがレンダリング
$('#map_canvas')
され、単純な div 要素として生成されます (マップは添付されていません)。 - Google マップ API は aync-ly を返し、変更し
$('#map_canvas')
ます。 - どういうわけか Meteor は変更を検出し、にもかかわらず、
{{#isolate}}
テンプレート全体をもう一度レンダリングすることを決定します (これはログに表示されます)。 - 内で initialize() が再度呼び出されます
Template.test.rendered
。
私の質問:
- なぜ?
- これが起こったのなら、Meteor が無限回ではなく 2 回しかレンダリングされないのはなぜですか?
- 解決?
3 つの質問、どうもありがとうございました。