我正在尝试开发一个基于Backbone JS的应用程序。我想嵌入一个基于传单JS的OpenStreetMap地图,但我找不到任何教程。
答案 0 :(得分:8)
我发现上面的答案错误地渲染了地图。
Leaflet期望在初始化地图时,包含元素已经位于DOM中。这就是使用setTimeout
“工作”的原因。当setTimeout
触发时,View已被附加到页面,因此Leaflet可以正确初始化。
我认为拆分追加步骤和渲染步骤更加清晰。通过在呈现之前将视图附加到页面,您可以确保Leaflet正确初始化而无需使用setTimeout
。
这是一个基于上面的例子:
var MapView = Backbone.View.extend({
render: function () {
this.map = L.map(this.el).setView([55.75, 37.58], 10);
L.tileLayer('http://{s}.tile.cloudmade.com/4e5f745e28654b7eb26aab577eed79ee/997/256/{z}/{x}/{y}.png', {
attribution: 'Map data © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://cloudmade.com">CloudMade</a>[…]',
maxZoom: 18
}).addTo(map);
return this;
}
});
$('body').append(MapView.el);
MapView.render();
答案 1 :(得分:2)
我已经创建了一个jsfiddle来展示如何在Backbone.View中使用Leaflet: http://jsfiddle.net/theotheo/CJcK6/
// bare template
<script type='template' id='map-template'>
<div id="map"></div>
</script>
// simple view
var MapView = Backbone.View.extend({
template: _.template($('#map-template').html()),
render: function () {
this.$el.html(this.template());
var map = L.map(this.$('#map')[0]).setView([55.75, 37.58], 10);
L.tileLayer('http://{s}.tile.cloudmade.com/4e5f745e28654b7eb26aab577eed79ee/997/256/{z}/{x}/{y}.png', {
attribution: 'Map data © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://cloudmade.com">CloudMade</a>[…]',
maxZoom: 18
}).addTo(map);
return this;
}
});
随意问。
<强>更新强>:
jQuery Mobile示例:http://jsfiddle.net/theotheo/mh6mA/