2017-01-18 15 views
0

Как клонировать слой в OL3?Нужно клонировать слой в OL3

На данный момент я пробую это, но он дает мне другой объект с различным аспектом реального ol.layer. Как вы можете видеть в журнале внутренней консоли, я потерял экземпляр слоя, и для меня важно сохранить его.

<!DOCTYPE html> 
 
<html> 
 
    <head> 
 
    <link rel="stylesheet" href="https://openlayers.org/en/v3.20.1/css/ol.css" type="text/css"> 
 
    <!-- The line below is only needed for old environments like Internet Explorer and Android 4.x --> 
 
    <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList,URL"></script> 
 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
    <script src="https://openlayers.org/en/v3.20.1/build/ol.js"></script> 
 
    
 
    </head> 
 
    <body> 
 
    <div id="map" class="map" tabindex="0"></div> 
 
    <script> 
 
     var map = new ol.Map({ 
 
     layers: [ 
 
      new ol.layer.Tile({ 
 
      source: new ol.source.OSM() 
 
      }) 
 
     ], 
 
     target: 'map', 
 
     view: new ol.View({ 
 
      center: [0, 0], 
 
      zoom: 2 
 
     }) 
 
     }); 
 
     console.log("map layer is an instanceof ol.layer.tile? ", map.getLayers().getArray()[0] instanceof ol.layer.Tile) 
 
     
 
     function cloneLayer() { 
 
     map.getLayers().getArray().forEach(function(layer) { 
 
      var copyLayer = jQuery.extend(true, {}, layer); 
 
      console.log("CopyLayer is an instanceof ol.layer.tile? ", copyLayer instanceof ol.layer.Tile) 
 
      console.log("CopyLayer is equal to mapLayer? ", map.getLayers().getArray()[0] == copyLayer) 
 
     }); 
 
     } 
 
     
 
     cloneLayer() 
 

 
    </script> 
 
    </body> 
 
</html>

+0

Я тестировал его, и он работает для меня. Если вы предоставите нам больше кода, мы сможем помочь вам лучше. – Icarus

+0

Я добавляю плункер. Вы увидите, что это не эквивалентно, и я потерял экземпляр слоя ... – FatAl

ответ

1

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

Многие другие классы в ol3 имеют свой метод clone, чтобы сделать это. Клонирование слоя включает копирование вашего источника, который имеет функции и многие многие другие объекты.

Функция jQuery.extend отлично подходит для элементов DOM, она была сделана для объектов DOM, see docs, для сложных объектов, являющихся экземплярами пользовательских классов, прототипированных классов, как и все классы ol, сделаны, клонирование объекта намного больше сложнее, чем повторять его свойства и копировать каждый.

Итак, я предлагаю вам создать новый слой и просто скопировать их параметры, если вам нужен другой слой с такими же характеристиками.

Или, если бы вы могли объяснить, что вам нужно клонировать слой, возможно, у нас может быть альтернативное решение.

+0

Может быть, ваше право, я проанализирую свой подход и даю подробнее позже. Спасибо – FatAl

+1

Наконец, мне больше не нужно клонировать слой, и, вероятно, это плохой подход. – FatAl

0

Я не familliar с OL3, но, возможно, вы могли бы попробовать использовать оригинальный объект как прототип нового с

вар copyLayer = Object.create (layer.prototype)

+0

Вам нужно передать прототип слоя вместо самого слоя. , который не будет клонировать свойства слоя для copyLayer. см. [Спецификация Object.create] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/create) – tfidelis