this.leafletMap = new L.Map( <element> , {
zoomControl: true,
dragging: this.isInDragMode,
touchZoom: false,
scrollWheelZoom: false,
doubleClickZoom: false,
tap: false,
}
L.tileLayer( 'http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
} ).addTo( this.leafletMap );
if (this.leafletMap ){
this.leafletMap.eachLayer(function(layer){
layer.remove();
});
this.leafletMap.remove();
this.leafletMap = null;
}
Uncaught TypeError: Cannot read property '_leaflet_pos' of undefined
http://playground-leaflet.rhcloud.com/ λλ κΈ°ν jsfiddleκ³Ό μ μ¬ν μ¬μ΄νΈ μ¬μ©.
μλ νμΈμ. μκ°μ λ΄μ΄ μ΄ λ²κ·Έλ₯Ό μ κ³ ν΄ μ£Όμ μ κ°μ¬ν©λλ€.
κ·Έλ¬λ λ¬Έμ λ₯Ό μ¬ννκΈ° μν΄ μ€λͺ νλ λ¨κ³μμ λλ½λ λΆλΆμ΄ μλ κ² κ°μ΅λλ€. μμ λ¨κ³λ₯Ό λ°λΌ ν μ μλ κ²μ²λΌ λμ΄ν° μμ λ₯Ό μ€μ νμ΅λλ€. http://playground-leaflet.rhcloud.com/rezop/edit?html ,output
μ΄ μμμλ μ§λκ° μ κ±°λ ν μ€λ₯λ₯Ό λ³Ό μ μμ΅λλ€. λ°λΌμ νμ¬ λ³΄κ³ μλ λ¬Έμ λ₯Ό μΌμΌν€λ λ λ§μ μμ μ΄ μ§νλκ³ μλ κ² κ°μ΅λλ€. μΆμ ν μ μλλ‘ λ μμΈν μ 보λ₯Ό μ κ³΅ν΄ μ£Όμκ² μ΅λκΉ?
@perliedman λΉ λ₯Έ μλ΅κ³Ό λμ΄ν° μμ λ₯Ό ν¨κ»
map.remove()
νλ κ²½μ° λͺ
μμ μΈ λ μ΄μ΄ μ κ±°κ° νμν©λκΉ? λ΄ μκ°μλ λ μ΄μ΄ μ κ±°λ μ²λ¦¬νμ§λ§ νμΈν μ μμ΅λκΉ?
κ·Έλ¦¬κ³ timeout μλμ map.remove()κ° μλ μ΄μ λ μμ μμ μμ± μ§ν 맡μ νκ΄΄νκ³ μκΈ° λλ¬Έμ λλ€. κ·Έλ μ§ μμΌλ©΄ νμμμμΌλ‘ λ¬Άμ νμκ° μμ΅λλ€. μ³μ?
μ€ν μμ€λ‘ μμ
ν λ μμ€λ₯Ό _μ¬μ©_νλ€λ κ²μ κΈ°μ΅νμμμ€! :wink: 첫 λ²μ§Έ μ§λ¬Έμ λ΅νκΈ° μν΄ _yes_, remove
κ° λ μ΄μ΄λ₯Ό μ κ±°ν©λλ€: https://github.com/Leaflet/Leaflet/blob/master/src/map/Map.js#L731
νμμμμ λ£μ μ΄μ λ νμΌ λ μ΄μ΄κ° μ€μ λ‘ λ‘λλ νμΌ λ±μΌλ‘ μ λλ‘ μ΄κΈ°νλμλμ§ νμΈνμ¬ λ΄ μμ λ₯Ό μ’ λ νμ€μ μΌλ‘ λ§λ€κΈ° μν¨μ΄μμ΅λλ€. μμ λ remove
νΈμΆμ λ£μ§ μκ³ λ μ μλν©λλ€. μκ° μ΄κ³Όμ΄μ§λ§ μ½κ°μ μΈκ³΅ ν
μ€νΈμ²λΌ 보μ
λλ€.
μλ νμΈμ. μ λ μ΄ λ¬Έμ λ₯Ό κ²ͺκ³ μλ κ² κ°μ΅λλ€. λ΄ κΈ°λ³Έ μ¬μ© μ¬λ‘λ λ€μκ³Ό κ°μ΅λλ€.
μ€μ μ§λλ₯Ό νμνλ κ²κ³Όλ λμ‘°μ μΌλ‘ μ¬λ¬ νμ΄μ§/νλ©΄μ΄ μλ κ°μ²΄μ λν λ·°μ΄ κ΅¬μ± μμ( Leaflet-IIIF νλ¬κ·ΈμΈμ μ¬μ©νμ§λ§ μ¬κΈ°μλ μ무 μν₯λ λ―ΈμΉμ§ μλλ€κ³ μκ°ν©λλ€)λ₯Ό λ§λ€κ³ μμ΅λλ€. λ·°μ΄κ° λ‘λλλ©΄ μ¬μ©μκ° ν΄λ¦νμ¬ UIμ μ€μ μμμ νμλλ κ°μ²΄ 보기λ₯Ό μ λ°μ΄νΈν μ μλ μΌλ ¨μ μΆμνμ΄ μμ΅λλ€.
μ¬μ©μκ° λ³΄κΈ°λ₯Ό λ³κ²½ν λ μ 보기μ λν μ μ§λλ₯Ό μ€μ νκΈ° μ μ map.remove()
λ₯Ό νΈμΆν©λλ€. μ 맡μ μ΄μ 맡과 λμΌν DOM μμ(IDκ° μλ div)μ μμ±λλ©°, μ λ Leaflet μΈλΆμμ DOMμ μμ νμ§ μμ΅λλ€.
μ΄κΈ° 보기μμλ λͺ¨λ κ²μ΄ μ μλν©λλ€. κ·Έλ¬λ map.remove()
νΈμΆνκ³ μ 보기λ₯Ό νμν ν μ½μμ μ§λλ₯Ό λκ±°λ νλ/μΆμν λλ§λ€ Cannot read property '_leaflet_pos' of undefined
ν©λλ€.
μ΄λ μμ μμ μ΅μνμ μλ₯Ό κ²μνλ €κ³ ν μ μμ§λ§ μ΄κ²μ λμΌν λ¬Έμ μΈ κ² κ°μ΅λλ€. μ΄ μ€λ₯λ Chromeμμλ λνλμ§λ§ Firefoxμμλ λνλμ§ μμ΅λλ€.
@egardner λ€, μ΄κ²μ μ¬ννλ μμ λ₯Ό λ§λ€μ΄ 보μΈμ!
@egardner μ΄μ μ μμ μ μΈ μ μ(ν¬λ‘¬ + λ
Έλ) μ±μμ λμΌν λ¬Έμ λ‘ λλλ €μΌ νμ΅λλ€.
"리νλ¦Ώ": "1.0.0",
"leaflet.markercluster": "1.0.0-rc.1.0"
1.2.0μμ μ€λ₯λ₯Ό μ κ±°νλ €λ©΄ μ μλμ§ μμ μμ± '_leaflet_pos'λ₯Ό μ½μ μ μμ΅λλ€.
μ΄κ²μ λμΌν DOM μμμμ μ§λλ₯Ό λ€μ λ§λ€κΈ° μ μ map.remove() μ΄νμλ λ°μνμ΅λλ€. μ§κΈ λΉμ₯μ λ¨κΈ°μ μΌλ‘ λ§λ€κ³ μμν μκ°μ΄ μμ΅λλ€.
μ°λ¦¬λ λν μ§λλ₯Ό νκ΄΄νλ €κ³ μλνλ μ μ¬ν λ¬Έμ λ₯Ό κ²½ννκ³ μμ΅λλ€, κ·Έκ²μ μ°Έμ‘°λ₯Ό μ μ§νλ κ² κ°μ΅λλ€
μμμ λ§ν κ²μ λ°λ³΅νκ² μ΅λλ€. μ΄ λ¬Έμ μ λν΄ λ¬΄μμ΄λ ν μ μλλ‘ λ¬Έμ λ₯Ό μ¬ννλ μλ₯Ό μ 곡νμμμ€.
μλ
νμΈμ. λλ λ°μ΄μ¬λ¦°μμμ΄ μ€λ₯λ₯Ό μ¬ννμ΅λλ€. κ°λ¨ν λ§ν΄μ div μμ λ΄λΆμ 맡μ λ§λ λ€μ remove λ©μλλ₯Ό μ¬μ©ν λ€μ λμΌν divμ 맡μ λ€μ μ±μ°λ©΄ λͺ¨λ 맡 μ΄λμ΄ μ€λ₯λ₯Ό μμ±ν©λλ€.
μ‘νμ§ μμ TypeError: μ μλμ§ μμ '_leaflet_pos' μμ±μ μ½μ μ μμ΅λλ€.
μ¬ννλ €λ©΄ λ΄ λ°μ΄μ¬λ¦°μ μ΄κ³ μ§λ μ κ±°λ₯Ό ν΄λ¦νκ³ μ§λ μμΉλ₯Ό ν΄λ¦ν λ€μ μ½μμ μ΄κ³ μ§λλ₯Ό μ΄λν©λλ€.
http://jsfiddle.net/spydmobile/5hmadjnk/
FFκ° μλ Chormeμμλ§ λ°μν©λλ€.
μ spydmobile μλ₯Ό λ€μ΄ μ£Όμ μ κ°μ¬ν©λλ€. μμμ λ³΄κ³ ν κ²κ³Ό λμΌν μ€λ₯κ° Chromeμμ νμλ©λλ€.
λμΌν μ€λ₯κ° νμλμ§λ§ μ¬μ© μ¬λ‘κ° μ½κ° λ€λ¦
λλ€. invalidateSize
νΈμΆλ‘ μΈν΄ ν¬κΈ° μ‘°μ μ λμΌν μ€λ₯κ° λ°μν©λλ€.
Uncaught TypeError: Cannot read property '_leaflet_pos' of undefined
at getPosition (leaflet-src.js:2765)
at NewClass._getMapPanePos (leaflet-src.js:4378)
at NewClass._rawPanBy (leaflet-src.js:4180)
at NewClass.invalidateSize (leaflet-src.js:3509)
at NewClass.<anonymous> (leaflet-src.js:4244)
μ 체 νΈμΆ μ€νμ _onResize
νΈλ€λ¬μμ μμλ©λλ€. react-leaflet
μμ§λ§ μ€ν μΆμ μ μ΄λ€ λΆλΆλ λ¬Έμ κ° λλ λ‘컬 μ½λλ ν΄λΉ μ½λλ₯Ό κ°λ¦¬ν€μ§ μμ΅λλ€. λλ λͺ κ°μ§ μ΄μ λ²μ (μ: 1.0.3
λ° 1.2.0
)μ μλνμ§λ§ νΉμ 1.x.x
λ²μ μΌλ‘ μ κΈ μ μμ κ²μ΄λΌκ³ μκ°νμ§λ§ μ΄μ΄ μμμ΅λλ€.
μ΄μ λν μ λ°μ΄νΈκ° μμ΅λκΉ? λ΄ μμ© νλ‘κ·Έλ¨μ μ λ¨μ§λ₯Ό ν΅ν©νλ κ²κ³Ό λμΌν λ¬Έμ κ° μμ΅λλ€. μ§λκ° νκ΄΄λ νμλ dom μμμλ μ¬μ ν _leaflet_events μμ±μ΄ μμ§λ§ μ΄ κ°μ²΄λ₯Ό μ κ±°νλ κ²λ λμμ΄ λμ§ μμμ΅λλ€.
μ²λ¦¬κΈ° ν¨μμ 컨ν μ€νΈκ° μ€λλ κ² κ°μ΅λλ€(μ²λ¦¬κΈ° μΈμμ _mapPane κ°μΈ μμ±μ΄ μ‘΄μ¬νμ§ μλ μμλ₯Ό κ°λ¦¬ν΄).
μ λ μ΄κ²μ κ²ͺκ³ μμ΅λλ€. μ΄κ²μ λ΄κ°λ³΄κ³ μλ μμΈ μ€ νλμ λλ€.
https://sentry.io/share/issue/b414c58ea85c44ee9e0e40ad0781883a/
μ΄κ²μ μ¬μ©μκ° λΈλΌμ°μ λ€λ‘ λ²νΌμ μ¬μ©νμ¬ μ§λλ₯Ό λ λ λ μ£Όλ‘ λ°μνλ κ² κ°μ΅λλ€.
ν΄κ²°μ± μ μ°Ύμμ μλ μλ€κ³ μκ°ν©λλ€.
Map 컨ν
μ΄λ divμλ map.off
λ° map.remove
μ΄νμλ λ°μνλ μΌλΆ μ΄λ²€νΈκ° μ¬μ ν μμ΅λλ€.
μ κ²½μ°μλ μ§λμ _leaflet_
μμνλ μμ±μ΄ μκ³ ν΄λΉ κΈ°λ₯ μ€ μΌλΆλ "map._leaflet_events".
μμ±μ μ§λ μ체μ μλ κ²μΌλ‘ λνλ¬μ΅λλ€.
pointerdown
, pointermove
λ±μΌλ‘ 첨λΆλ κ² κ°μ§λ§ μμ±μ μ΄λ¦μ map._leaflet_touchstarttouchstart32
λ±κ³Ό κ°μ΅λλ€.
λλ κ·Έκ²λ€μ λ°λ³΅νκ³ μλμΌλ‘ μ κ±°νλ©΄( removeEventListener
λ€μ μ’μ μΈ‘μ μ μν΄ μμ± μ체λ₯Ό nullλ‘ λ§λ€κ³ μμ ), λ€λ₯Έ 맡μ divλ₯Ό μ¬μ¬μ©ν μ μλ€λ κ²μ μμμ΅λλ€.
μ΄κ²μ λν λ΄κ°λ³΄κ³ μλ λ©λͺ¨λ¦¬ λμμ μ’
μ§λΆλ₯Ό μ°μμ΅λλ€.
μ¬κΈ°μ μ½λλ₯Ό κ²μν μλ μμ§λ§ POINTER_DOWN
λν μ λ¨μ§ μμ€λ₯Ό κ²μνλ©΄ 첨λΆλ μ΄λ²€νΈλ₯Ό λ³Ό μ μκ³ μ΄λ₯Ό λΆλ¦¬νλ λ°©λ²μ μ μ μμ΅λλ€.
ChromeμμλΏλ§ μλλΌ FFμμλ μ¬νν μ μμ΅λλ€(λ΄ νλ‘μ νΈμ @spydmobileμμ μ 곡νλ jsfiddle λͺ¨λ μ¬μ©)
@FLoibl μλ§λ ν΄κ²° λ°©λ²μ μ±κ³΅μ μΌλ‘ μ¬μ©νλ κΈ°μ μ 보μ¬μ£ΌκΈ° μν΄ λ€λ₯Έ κ³³μ κ²μλ μμ , λ°μ΄μ¬λ¦° λλ μΌλΆ μ€λν«μ΄ μμ΅λκΉ?
@spydmobileμ΄ μ¬κΈ°μ μμ΅λλ€. μ΄κ²μ λ΄κ° μ½κ° μμ λ ννλ‘ μνν κ²μ
λλ€.
μ΄ λΉμ΄λ¨Ήμ λκΈ νλμ μ½λλ₯Ό μ λλ‘ κ²μνλ λ°©λ²μ λͺ¨λ₯΄κ² μ΅λλ€. μ£μ‘ν©λλ€.
μ§κΈ μ λκΈμ 10λ²μ λ μμ νμ΄μ γ
γ
γ
γ
function removeMap()
{
var leafletCtrl = get_your_own_leaflet_reference_from_somewhere(),
dom = leafletCtrl.getReferenceToContainerDomSomehow();
//This removes most of the events
leafletCtrl.off();
//After this, the dom element should be good to reuse, unfortunatly it is not
leafletCtrl.remove();
var removeDanglingEvents = function(inputObj, checkPrefix)
{
if(inputObj !== null)
{
//Taken from the leaflet sourcecode directly, you can search for these constants and see how those events are attached, why they are never fully removed i don't know
var msPointer = L.Browser.msPointer,
POINTER_DOWN = msPointer ? 'MSPointerDown' : 'pointerdown',
POINTER_MOVE = msPointer ? 'MSPointerMove' : 'pointermove',
POINTER_UP = msPointer ? 'MSPointerUp' : 'pointerup',
POINTER_CANCEL = msPointer ? 'MSPointerCancel' : 'pointercancel';
for(var prop in inputObj)
{
var prefixOk = checkPrefix ? prop.indexOf('_leaflet_') !== -1 : true, propVal; //if we are in the _leaflet_events state kill everything, else only stuff that contains the string '_leaflet_'
if(inputObj.hasOwnProperty(prop) && prefixOk)
{
//Map the names of the props to the events that were really attached => touchstart equals POINTER_DOWN etc
var evt = [];
if(prop.indexOf('touchstart') !== -1) //indexOf because the prop names are really weird 'touchstarttouchstart36' etc
{
evt = [POINTER_DOWN];
}
else if(prop.indexOf('touchmove') !== -1)
{
evt = [POINTER_MOVE];
}
else if(prop.indexOf('touchend') !== -1)
{
evt = [POINTER_UP, POINTER_CANCEL];
}
propVal = inputObj[prop];
if(evt.length > 0 && typeof propVal === 'function')
{
evt.each(function(domEvent)
{
dom.removeEventListener(domEvent, propVal, false);
});
}
//Reference B-GONE, Garbage b collected.
inputObj[prop] = null;
delete inputObj[prop];
}
}
}
};
removeDanglingEvents(dom._leaflet_events, false);
removeDanglingEvents(dom, true);
}
@FLoibl μ°Έμ‘° https://help.github.com/articles/basic-writing-and-formatting-syntax/#quoting -code
μ, νΈλ¦¬ν λ°±ν±, μκ² μ΅λλ€.
@FLoibl μ΄κ²μ μμ£Ό μ’μ μ‘°μ¬μ λλ€ :+1:
λ‘κΉ μ μΆκ°ν΄ μ£Όμκ² μ΅λκΉ...? https://github.com/Leaflet/Leaflet/blob/5161140e952969c5da27751b79154a2c93f53bfa/src/dom/DomEvent.Pointer.js#L39/DomEvent.Pointer.js#L39 λ° https://github.com/Leaflet/Leaflet/blob/fe9380 js#L133
κ·Έκ²λ€ μ L.Map
κ° νκ΄΄λ λ λͺ¨λ μ΄λ²€νΈμ λν΄ μ€ν λμ΄μΌ νκ³ , λΉμ μ΄ νκ³ μλ κ²κ³Ό κ°μ μΌμ ν΄μΌ νμ§λ§, μ κ·Έκ²μ΄ μμλλ‘ μλνμ§ μλμ§ κΆκΈν©λλ€.
μ, λλ κ·Έ κΈ°λ₯μ μκ³ μκ³ κ·Έκ²μ΄ νΈμΆλλ€λ κ²μ μμ§λ§ λͺ¨λ μ΄λ²€νΈμ λν΄ κ·Έλ μ§λ μμ΅λλ€.
λ¬Έμ λ μ½λκ° domμ "pointermove" λ±μΌλ‘ 첨λΆνμ§λ§ μμ± μ΄λ¦μ "touchstart" λ±μ΄λΌλ κ²μ λλ€. λν "touchstart"λΌλ λ¨μ΄κ° μμ± μ΄λ¦μ λ λ² νμλ©λλ€. μμ΄λμ μ΄λ²€νΈλͺ ?
λν μ΄λ¬ν "ν¬μΈν°" μ΄λ²€νΈλ ν°μΉμ€ν¬λ¦°μ΄ μλ Windows 10 λ° Chromeμλ 첨λΆλμ΄μΌ ν©λκΉ?
λΆννλ, λλ μ€μ μμ μ μ 곡νκΈ° μν΄ μ λ¨μ§ λ΄λΆ μλμ λν΄ μΆ©λΆν μμ§ λͺ»ν©λλ€ :-(
λλ κ·Έ κΈ°λ₯μ μκ³ μκ³ κ·Έκ²μ΄ νΈμΆλλ€λ κ²μ μμ§λ§ λͺ¨λ μ΄λ²€νΈμ λν΄ κ·Έλ μ§λ μμ΅λλ€.
μ΄μ μ§λ¬Έμ λ€μκ³Ό κ°μ΅λλ€. removePointerListener
κ° νΈμΆ λμ§ μμ μ΄λ²€νΈλ 무μμ
λκΉ? μ¬κΈ° μ κΈ°μ ν¨μ νΈμΆμ΄ λλ½λμμ μ μμ΅λλ€.
λν μ΄λ¬ν "ν¬μΈν°" μ΄λ²€νΈλ ν°μΉμ€ν¬λ¦°μ΄ μλ Windows 10 λ° Chromeμλ 첨λΆλμ΄μΌ ν©λκΉ?
μ. μμ€ν μ ν°μΉμ€ν¬λ¦°μ΄ μλμ§ μ¬λΆλ₯Ό κ°μ§νλ κ²μ κ±°μ λΆκ°λ₯νλ―λ‘ λΈλΌμ°μ κ° ν¬μΈν° μ΄λ²€νΈλ₯Ό μ§μνλ κ²½μ° ν¬μΈν° μ΄λ²€νΈκ° μ¬μ©λ κ²μ΄λΌκ³ κ°μ ν©λλ€.
λλ μ€μ μμ μ μ 곡νκΈ° μν΄ μ λ¨μ§ λ΄λΆ μλμ λν΄ μΆ©λΆν μμ§ λͺ»ν©λλ€ :-(
μ΄λ΄, μ λ§νμ§ λ§, μ΄κ²μ νλ₯ν μ‘°μ¬ μμ μ΄μΌ! :μλ€:
μ΄ λ²κ·Έλ λ²μ 1.0.3μλ μμ΅λλ€. @spydmobile jsfiddleμ μ ννκ³ μ λ¨μ§ λ²μ μ λ³κ²½νλ©΄ μ€λ₯κ° μ¬λΌμ§λλ€ http://jsfiddle.net/5hmadjnk/47/ . λ²μ 1.1.0μμλ μ΄λ―Έ μμ΅λλ€.
@benru89 μ΄ λ²κ·Έλ μ€μ λ‘ https://github.com/Leaflet/Leaflet/issues/5263 μ ννλ‘ 1.0.3μ μ‘΄μ¬νμ΅λλ€(λλΆλΆ https://github.com/Leaflet/Leaflet/pull/μ μν΄ μμ λ¨). 5265).
1.1.0μ 1.0.3μμμ λ³νλ λν νμ¬ μ¬μ©λμ§ μλ μν₯μ L.Mixin.Events
λλμ΄λμ§λ ν¨κ» μ μλλ‘ μΆμ ν μ μλ€κ³ μκ°νμ§ μλλ‘νκ³ , rollupJS λΉλλ₯Ό git bisect
.
@IvanSanchez 1.0.3κ³Ό 1.1.0μ μ κ±° κΈ°λ₯μ λΉκ΅
for (i in this._panes) {
remove(this._panes[i]);
}
this._layers = [];
this._panes = [];
delete this._mapPane;
delete this._renderer;
μ¬μ― λ²μ§Έ μ€μ μ κ±°νλ©΄ mapPaneμ μμ νλ μ€λ₯κ° μ¬λΌμ§λλ€. κ·Έλ¬λ μ΄κ²μ μ κ±°νλ κ²μ μν₯μ λͺ¨λ₯΄κ² μ΅λλ€. mapPaneμ΄ μμ λμ΄μΌ νλ€κ³ μκ°νμ§λ§ μ΄ λ²κ·Έλ ν΄λΉ μ€μ΄ μΆκ°λμμ λ νμ€ν λμ λμμ΅λλ€.
@benru89 μ, κ·Έκ²λ μ’μ μ 보
μ§κΈμ μ§λ μ°½μ μ΄λ€ ν¬μΈν° μ΄λ²€νΈ νΈλ€λ¬κ° μλμ§ μ μ μμ΅λλ€.
μ§λ μ°½μ μ κ±°νμ§ μμμΌλ‘μ¨ λ¬Έμ λ₯Ό κ°λ¦΄ λΏμ΄λΌκ³ μκ°ν©λλ€. νΈμΆ μ€νμ μΆμ νμ λ λ¬Έμ λ μΌλΆ _mapPane κ°μ²΄κ° νκ΄΄λ dom μμλ₯Ό κ°λ¦¬ν€κ³ μμΌλ―λ‘ μ μλμ§ μμ μμΉμμ μΊμλ μμΉλ₯Ό μ»μΌλ €κ³ νλ€λ κ²μ λλ€. μ°½μ΄ νκ΄΄λμ§ μμΌλ©΄ κ³ μ€νΈ μ΄λ²€νΈκ° μμΈλ₯Ό νΈλ¦¬κ±°νμ§ μκ³ μ§νλ μ μμ΅λλ€.
@Floibl λλ λΉμ μκ² λμν©λλ€. λλ κ·Έκ²μ΄ ν΄κ²°μ± μ΄ μλλΌκ³ μκ°νμ§λ§ νΈμΆ μ€νμ νμΈν λ null _mapPaneμ λ°κ²¬νκΈ° λλ¬Έμ κ·Έ μ€μ μ κ±°νμ§ μμΌλ €κ³ μλνμ΅λλ€. μ루μ μ λ΄κ° μΆμΈ‘νλ μ΄λ²€νΈ νΈλ€λ¬λ₯Ό μ μ νκ² μ κ±°νλ μΈ‘λ©΄μ μμ΄μΌ ν©λλ€.
λλ μ΄κ²μ μΌμΌν€λ μ΄λ²€νΈ νΈλ€λ¬(μ μ΄λ λ΄ κ²½μ°μλ @spydmobile )λ₯Ό "touchExtend"λΌκ³ νλ―λ‘ leaflet.draw νΈλ€λ¬μ λλ€. λλ leaflet.drawμ λν κ°μ Έμ€κΈ°λ₯Ό μ κ±°νλ©΄ μμΈλ μ€μ§λλ€λ κ²μ μμμ΅λλ€.
λ€λ₯Έ ν΄κ²° λ°©λ²μ μ°Ύμμ΅λλ€. λ¬Έμνλμ§ μμ μ΅μ
touchExtend : false
μ§λλ₯Ό μ΄κΈ°ννλ©΄ λ¬Έμ κ° μλ νΈλ€λ¬κ° λΉνμ±νλλ―λ‘ λ μ΄μ μμΈκ° λ°μνμ§ μμ΅λλ€. λλ κ·Έλ κ²ν¨μΌλ‘μ¨ μ΄λ€ κΈ°λ₯μ μμ΄ λ²λ Έλμ§ μ λ§λ‘ λͺ¨λ₯΄μ§λ§ μ½λλ₯Ό 보면 λͺ¨λ°μΌ λλ ν°μΉ μ€ν¬λ¦°μ μν νμ₯ μ μ€μ²κ° λ μ μμ΅λλ€. μ΄μ¨λ λ΄ μ±μ λͺ¨λ κ²μ΄ μ μλνλ κ² κ°μ΅λλ€.
@IvanSanchez λμΌν λ¬Έμ μΈμ§ νμ€νμ§ μμ§λ§ κ΄λ ¨λ μ μμ΅λλ€.
νλ/μΆμ μ λλ©μ΄μ
μ΄ μ§ν μ€μΌ λ μ§λλ₯Ό νκ΄΄νλ©΄ Uncaught TypeError: Cannot read property '_leaflet_pos' of undefined
κ°μ μ€λ₯κ° λ°μν©λλ€.
λ΄κ° μ½λ λ΄λΆλ³΄κ³ μλνκ³ λ°κ²¬ κ·Έ μμ Map._animateZoom()
μ μ΄ : setTimeout(Util.bind(this._onZoomTransitionEnd, this), 250);
μΆ©λΆν μ΄ν΄νλ©΄ μ΄ νμμμμ λ§΅μ΄ μ κ±°λ λ μλ©Έλμ§ μμΌλ―λ‘ Map._onZoomTransitionEnd
ν¨μκ° νμ νΈμΆλ©λλ€. κ·Έκ²μ λΉμ μ _"μ¬κΈ°μ λλ μ κΈ°μ ν¨μ νΈμΆμ λμΉλ κ²"_μΌ μ μμ΅λλ€.
κ·Έλ¦¬κ³ λ¨μνλ νΈμΆ νΈλ¦¬ this._onZoomTransitionEnd
-> this._move
-> this._getNewPixelOrigin
-> this._getMapPanePos
-> getPosition(this._mapPane)
-> return el._leaflet_pos
this._mapPane
κ° _undefined_μ΄κΈ° λλ¬Έμ return el._leaflet_pos
κ° μ€ν¨ν©λλ€.
this._move
λ° this._moveEnd
νΈμΆμ if (this._mapPane) {}
쑰건μΌλ‘ λννλ©΄ μ΄ κ²½μ°κ° μμ λ μ μμ§λ§ λ€λ₯Έ κ²°κ³Όκ° μλμ§ ν
μ€νΈνμ§ μμμ΅λλ€.
μ΄κ²μ κ΅μ²΄νμμμ€:
_onZoomTransitionEnd: function () {
if (!this._animatingZoom) { return; }
if (this._mapPane) {
removeClass(this._mapPane, 'leaflet-zoom-anim');
}
this._animatingZoom = false;
this._move(this._animateToCenter, this._animateToZoom);
// This anim frame should prevent an obscure iOS webkit tile loading race condition.
requestAnimFrame(function () {
this._moveEnd(true);
}, this);
}
μ΄κ²μΌλ‘:
_onZoomTransitionEnd: function () {
if (!this._animatingZoom) { return; }
this._animatingZoom = false;
if (this._mapPane) {
removeClass(this._mapPane, 'leaflet-zoom-anim');
this._move(this._animateToCenter, this._animateToZoom);
// This anim frame should prevent an obscure iOS webkit tile loading race condition.
requestAnimFrame(function () {
this._moveEnd(true);
}, this);
}
}
μ΄μ λν μ
λ°μ΄νΈκ° μμ΅λκΉ? κ°μ λ¬Έμ κ° λ°μνμ΅λλ€. touchExtend : false
λ λμμ΄ λμ§ μμ΅λλ€. μ΄ λ¬Έμ λ μ§λκ° μλ λ·°μμ λ©λ¦¬ νμν λ€μ(μ΄ μμ μμ map.remove()λ₯Ό νΈμΆνμ¬ νκ΄΄λ¨) μ΄ λ·°λ‘ λ€μ νμν λ λ°μν©λλ€. μ μ§λλ₯Ό λ§λ€κ³ μ΄κΈ°νν΄μΌ νμ§λ§ setMaxBounds
λ©μλμ getPosition
μμ '_leaflet_pos' μ€λ₯κ° λ°μν©λλ€.
Uncaught (in promise) TypeError: Cannot read property '_leaflet_pos' of undefined
at getPosition (webpack-internal:///./node_modules/leaflet/dist/leaflet-src.js:2445)
at NewClass._getMapPanePos (webpack-internal:///./node_modules/leaflet/dist/leaflet-src.js:4409)
at NewClass._moved (webpack-internal:///./node_modules/leaflet/dist/leaflet-src.js:4413)
at NewClass.getCenter (webpack-internal:///./node_modules/leaflet/dist/leaflet-src.js:3774)
at NewClass.panInsideBounds (webpack-internal:///./node_modules/leaflet/dist/leaflet-src.js:3488)
at NewClass._panInsideMaxBounds (webpack-internal:///./node_modules/leaflet/dist/leaflet-src.js:4220)
at NewClass.setMaxBounds (webpack-internal:///./node_modules/leaflet/dist/leaflet-src.js:3444)
λν setView
λ©μλμμ:
Uncaught (in promise) TypeError: Cannot read property '_leaflet_pos' of undefined
at getPosition (leaflet-src.js?9eb7:2445)
at NewClass._getMapPanePos (leaflet-src.js?9eb7:4409)
at NewClass.containerPointToLayerPoint (leaflet-src.js?9eb7:3989)
at NewClass._getCenterLayerPoint (leaflet-src.js?9eb7:4446)
at NewClass._getCenterOffset (leaflet-src.js?9eb7:4451)
at NewClass._tryAnimatedPan (leaflet-src.js?9eb7:4526)
at NewClass.setView (leaflet-src.js?9eb7:3181)
map.remove() ν λμΌν λ¬Έμ , λ΄ μ§λλ₯Ό λ€μ μ΄κΈ°ννκ³ μ΄ μ νν μ€λ₯κ° λ°μν©λλ€.
v1.6.0κ³Ό λμΌν λ¬Έμ μ λλ€. 볡μ‘ν λ¬Έμ λ€
λ€μμ SSCCEμ λλ€. https://jsfiddle.net/0oafw694/1/
κΈ°λ³Έμ μΌλ‘ λ€μ μ½λλ₯Ό μ€ννλ©΄ ...
map = L.map('map');
map.setView(...);
map.setMaxBounds(...);
map.remove();
... λ κ°μ μ΄λ²€νΈ 리μ€λκ° μ°κ²°λ μνλ‘ λ‘λλ€.
moveend: (1) [β¦]
0: Object { fn: _panInsideMaxBounds(), ctx: undefined } // from setMaxBounds
unload: (2) [β¦]
0: Object { fn: _destroy() , ctx: {β¦} }
1: Object { fn: _destroyAnimProxy(), ctx: undefined }
zoomanim: (1) [β¦]
0: Object { fn: _createAnimProxy(), ctx: undefined }
zoomanim/_createAnimProxy
λ unload/_destroyAnimProxy
λ₯Ό ν΅ν΄ μ²λ¦¬λλ―λ‘ λ¬Έμ κ° μλ€κ³ μκ°ν©λλ€. κ·Έλ¬λ moveend/_panInsideMaxBounds
λ λ±λ‘μ μ·¨μν΄μΌ ν©λλ€. ν보λ₯Ό μ€λΉνκ² μ΅λλ€...
λ°©κΈ λμ IDκ° μλ 맡μ λν divλ₯Ό λ§λ€μμ΅λλ€. λ°λΌμ divλ₯Ό μ¬μ¬μ©ν΄μΌ ν λ λ©λͺ¨λ¦¬λ₯Ό ν΄μ νκΈ° μν΄ κΈ°μ‘΄ 맡μ μ κ±°()ν λ€μ(μΌλΆ μ΄λ²€νΈκ° μ¬μ ν μ§ν μ€μ΄λλΌλ) κ·Έλ° λ€μ λ€λ₯Έ IDλ‘ divλ₯Ό λ€μ κ·Έλ €μ μ 맡μ λ§λλλ€.
λν λͺ¨λ μ§λλ₯Ό κ°μ²΄μ μ μ₯νλ―λ‘ ν΄λΉ IDμ λ°λΌ μ‘°μν μ μμ΅λλ€(λμ IDλ₯Ό μ¬μ©νμ¬ λ κ° μ΄μμ μ§λλ₯Ό κ°λ λ³Ό μ μμ).
μ λ¨μ§μ λν λ΄ μ€νμ λ°λ₯΄λ©΄ κ°λ°μκ° μ‘°μνλ λͺ¨λ μ΄λ²€νΈ(μ: moveend, movestart λ±)λ κΈ°λ³Έ λμμ λ³κ²½νκ³ domμμ μ λ¨μ§λ₯Ό μΈλ‘λνλ λμ λ©λͺ¨λ¦¬μ λ¨μ μμ΅λλ€.
λλ μ΄κ²μ @moveend="()=>{enableRecenter = true}"
νμΌλ―λ‘ μ§λλ₯Ό μΈλ‘λ/μ κ±°νλ λμ 'moveend' νΈλ€λ¬κ° λ©λͺ¨λ¦¬μ λ¨μ μμμ΅λλ€.
μ§λ κ΅¬μ± μμ μ체μμ μ΄λ¬ν λ©μλμ μ‘°μ(λ΄ μ체 ꡬν)μ μ κ±°νλλ° μ΄μ μ΄ μ€λ₯κ° νμλμ§ μμ΅λλ€.
λ°λΌμ κΈ°λ³Έμ μΌλ‘ μ§λ λ°©λ²μ λ§μ§μ§ λ§μμμ€!!! λ¬Όλ‘ λΌμ΄λΈλ¬λ¦¬κ° μ΄ λμμ κ°μ§νκ³ μ΄ λ²κ·Έλ₯Ό μμ νμ§ μλ ν.
κ°μ₯ μ μ©ν λκΈ
@spydmobileμ΄ μ¬κΈ°μ μμ΅λλ€. μ΄κ²μ λ΄κ° μ½κ° μμ λ ννλ‘ μνν κ²μ λλ€.
μ΄ λΉμ΄λ¨Ήμ λκΈ νλμ μ½λλ₯Ό μ λλ‘ κ²μνλ λ°©λ²μ λͺ¨λ₯΄κ² μ΅λλ€. μ£μ‘ν©λλ€.
μ§κΈ μ λκΈμ 10λ²μ λ μμ νμ΄μ γ γ γ γ