Leaflet + Backbone.js:如何更新模型集合更新的视图?

时间:2014-03-03 18:45:42

标签: javascript node.js backbone.js leaflet

我对Leaflet和Backbone.js之间的集成存在问题。我在网上找到了一个样本(http://jsfiddle.net/dPqQy/),其中包含以下地图视图和模型:

App.Views.MapView = Backbone.View.extend({
id:"map",
render: function() {
    //render map element
    var map = this.map =  L.map(this.$el.attr('id'))
    .setView([this.model.get('centerLon'),  this.model.get('centerLat') ], 13)
    .addLayer(L.tileLayer(this.model.get('layerUrl'), { maxZoom: 18 }));

    //render each marker
    this.markerViews = this.model.get('markers').map(function(marker) {
        return new App.Views.MarkerView({model:marker, map:map}).render();
    });
    }
});

var map = new App.Models.Map({
    centerLon: 51.505,
    centerLat: -0.09,
    layerUrl:      'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/997/256/{z}/{x}/{y}.png',
    markers: new App.Collections.Markers([
        {id:1, latitude:-0.09, longitude:51.505},
        {id:2, latitude:-0.092, longitude:51.503},
        {id:3, latitude:-0.086, longitude:51.506}
    ])
 });

var mapView = new App.Views.MapView({model:map});
mapView.render();

现在,问题在于,当我尝试使用以下内容更新模型中的标记集合时,

map.get('markers').add(node);

(节点是我要添加的自定义标记,View不会更新,标记也不会显示在地图中。我做错了什么?谢谢!

2 个答案:

答案 0 :(得分:0)

可能你应该把它放在你的视野中

initialize: function () {
   this.listenTo(this.model, 'add', this.render);
},

这也将更新您的视图和地图

答案 1 :(得分:0)

感谢您的帮助。显然我通过添加以下内容修复了更新问题:

    initialize: function() {
        this.listenTo(this.model, 'add', this.addMarker);
    }

功能如下:

    addMarker: function() {

        var markers = this.model.get('markers');
        var markersLength = this.model.get('markers').length;
        var markerView = new App.Views.MarkerView({model: markers.models[markersLength-1], map:this.map});
        this.el.appendChild(markerView.render().el);
    }

在添加数据后,我还必须在模型上触发事件'add':

    map.get('markers').add(node);
    map.trigger('add'); 

现在,问题是地图不会使用标记实时刷新。有没有人用传单成功地做到了这一点?