2016-11-29 4 views
3

У меня есть приложение с большой картой, поэтому, чтобы быть репрезентативным, мне нужно будет предоставить только кусок кода. Итак, это то, как я стараюсь, чтобы удалить все слои с карты:Невозможно удалить все слои с карты

map.getLayers().forEach(function (layer) { 
    map.removeLayer(layer); 
}); 

//map.getOverlays().clear(); <-- also tried this, but to no effect 

И у меня есть некоторое случайное поведение - иногда все слои удаляются, а иногда нет. Это полная случайность, поэтому нет никакой гарантии, что вы сможете воспроизвести эту проблему. Поэтому мне может быть достаточно, чтобы я знал концептуально, почему это может произойти.

РЕШЕНИЕ

Это очевидно OL3 ошибка, потому что если я цикл и удалить только два раза, то он начинает работать:

map.getLayers().forEach(function (layer) { 
    map.removeLayer(layer); 
}); 
//for some crazy reason I need to do it twice. 
map.getLayers().forEach(function (layer) { 
    map.removeLayer(layer); 
}); 

Вероятно, это не ошибка, и есть некоторые секретный метод, который позволяет очистить карту. Но я не знаю об этом.

ответ

-1

я добиться того, что некоторое время назад таким образом:

for(i in map._layers){ 
    if(map._layers[i]._path != undefined) { 
     try{ map.removeLayer(map._layers[i]) }catch(e){ } 
    } 
} 

Может быть, это помогает

+0

Это приводит к такому же поведению. И я не вижу сообщений об ошибках внутри блока catch. – Jacobian

+0

Использует внутренние свойства карты. Никогда не делай этого! – ahocevar

2

Это не ошибка. Причина, по которой ваш код не работает, заключается в том, что вы изменяете коллекцию слоев при прохождении через нее. Это меняет индекс каждого слоя и вызывает неожиданные результаты.

Надлежащим образом, чтобы очистить все слои карты является использование ol.Map#setLayerGroup():

map.setLayerGroup(new ol.layer.Group()); 
+1

Не существует шаблона для удаления определенного слоя, если у нас есть условие, в forEach? Ваш ответ имеет смысл, но это не совсем то, что нужно OP. – F3L1X79

0

Вы можете использовать время цикла, чтобы сделать это, и проверьте длину массива слоя, так как они перестраиваются каждый раз слой удаляется, поэтому поэтому forEach не работает, попробуйте

var layerArray, len, layer; 
layerArray = map.getLayers().getArray(), 
len = layerArray.length; 
while (len > 0){ 
    layer = layerArray[len-1]; 
    map.removeLayer(layer); 
    len = layerArray.length; 
}