解析Open Layers 3地图

12

所以,我正在使用Open Layers 3和Ember.js制作一个仪表盘,我已经成功实现了地图的动态加载,但是当我离开这个路由时,我希望它能被销毁。我找到的唯一方法是map.destroy(),但它适用于旧版本的API,而在新版本中似乎没有这样的方法。

我在几次访问地图页面后使用Chrome调试器发现我有29个ol.Map对象。

目前我的代码如下:

App.MapView = Ember.View.extend({
  map: null,
  didInsertElement: function() {
    this.map = new ol.Map({
      target: 'map',
      layers: [
        new ol.layer.Tile({
          source: new ol.source.MapQuest({layer: 'sat'})
        })
      ],
      view: new ol.View({
        center: ol.proj.transform([37.41, 8.82], 'EPSG:4326', 'EPSG:3857'),
        zoom: 4
      })
    });
  },
  willDestroyElement: function() {
    // destroy this.map
  }
});

我在文档中找不到关于删除地图的任何内容。

提前感谢。


为什么不使用 map.dispose() 呢? - arm
1个回答

26

你应该尝试做这样的事情:

App.MapView = Ember.View.extend({
  // if you are not using Ember.get/set you'd better make this "private"
  _map: null,
  didInsertElement: function() {
    this._map = new ol.Map(...);
  },
  willDestroyElement: function() {
    this._map.setTarget(null);
    this._map = null;
  }
});

它将地图从其元素中分离,并允许进行正确的垃圾回收。如果有其他对地图对象的引用,请不要忘记将其删除。


1
想象一下,我有一个下拉框,允许您在“地图”对象之间进行切换,这些对象包含完全不同的图层、向量源、要素等。当我切换到Map2时,我希望Map1中的所有内容都被完全销毁。使用setTarget(null)是正确的方法吗? - Murphybro2
我认为你需要一个一个地销毁它们。但是我已经很久没有使用OpenLayers地图了,这是另一个问题;因此,我建议你将你的问题作为一个新问题提出,而不是在这里留下评论。 - Huafu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接