2014-10-27 147 views
0

我想在Template.foo.rendered中只運行一次代碼。我有一個Leaflet地圖和一個集成的定位控制插件。它迄今爲止效果很好,但似乎渲染的模板經常重新運行。因此,我的標記用於在地圖上定位用戶每隔幾秒就會重置一次。我只想初始化一次。只運行一次meteor.js代碼

var map, mapInit; 
    map = void 0; 

    mapInit = function (element){ 

     map = L.mapbox.map(element, 'examples.map-20v6611k').setView(new L.LatLng(52.02312,13.02627), 11); 
     L.control.locate({drawCircle: true, position: 'topright'}).addTo(map); 

    } 

    Template.map.rendered = function() { 
    $(window).resize(function() { 
     var h = $(window).height(); 
     $mc = $('#map'); 
     $mc.css('height', h); 
    }).resize(); 

    if (!this.rendered) { 
     mapInit('map'); 
     this.rendered = true; 
    } 
    } 

回答

1

您可能要到地圖的DOM元素保存到一個全局或應用程序變量(在這裏,Map),後來在DOM重新插入:

var Map; 

... 

var mapDomElement = $('#map'); 
if (Map.domElements) { 
    mapDomElement.replaceWith(Map.domElements); 
} else { 
    Map.mapObject = L.mapbox.map(...) // instantiate map here 
    Map.domElements = mapDomElement; 
} 

注重。高度重新計算:你不需要那樣做。使用CSS彈性盒模型,以最大限度地地圖高度:

<div style="display: flex; flex-flow: column; min-height: 100%"> 

    <div id="map" style="flex: 1"></div> 

    <div> 
    ... map controls here 
    </div> 
</div> 

this answer在柔性模型。 「東西在這裏」div是你的地圖。

+0

thx爲您的答案,但我不太清楚如何做到這一點。如果我嘗試測試map.domElements – Chromos 2014-10-27 11:26:25

+0

@Chromos:檢查我的更新嗎? – 2014-10-27 11:45:54

+0

我做了但我得到「Map.domElements是未定義的」。 – Chromos 2014-10-27 11:53:52