【问题标题】:Deconstructing an Open Layers 3 map解构 Open Layers 3 地图
【发布时间】:2014-09-23 12:38:34
【问题描述】:

所以,我使用 Open Layers 3 和 Ember.js 来制作仪表板,并且我已经动态加载了地图,但我希望它在我离开路线时被销毁,我发现的唯一东西就是地图。 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()

标签: javascript ember.js openlayers-3


【解决方案1】:

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

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;
  }
});

它将地图与其元素分离并允许正确的垃圾收集。如果有的话,不要忘记删除对地图对象的任何其他引用。

【讨论】:

  • 想象一下,我有一个下拉框,可让您在包含完全不同的图层、矢量源、特征等的“地图”对象之间进行切换。当我更改为 Map2 时,我希望 Map1 中的所有内容都被完全销毁. setTarget(null) 是要走的路吗?
  • 我认为你必须一个一个地销毁所有的东西。但是很长一段时间我没有使用开放图层地图,这是另一个问题;所以我建议你把你的问题作为一个新问题提出,而不是在这里发表评论