Skip to content

Commit 109e102

Browse files
[fix]切换地图l7报错,失去上下文 review by qiw
1 parent ad59027 commit 109e102

File tree

6 files changed

+59
-51
lines changed

6 files changed

+59
-51
lines changed

src/mapboxgl/mapping/webmap/v3/WebMap.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,10 @@ export class WebMap extends mapboxgl.Evented {
451451

452452
clean() {
453453
if (this.map) {
454+
const scene = this.map.$l7scene;
455+
if (scene) {
456+
scene.removeAllLayer();
457+
}
454458
this.map.remove();
455459
this.map = null;
456460
this._legendList = [];

src/mapboxgl/overlay/L7/l7-render.js

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/mapboxgl/overlay/L7Layer.js

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import { Scene, Mapbox } from './L7/l7-render';
1919

2020
export class L7Layer {
2121
constructor({ type, options }) {
22-
this.preBuild();
2322
this.type = 'custom';
2423
this.id = options && options.layerID ? options.layerID : CommonUtil.createUniqueID('l7_layer_');
2524
const _options = { ...(options || {}) };
@@ -28,18 +27,6 @@ export class L7Layer {
2827
}
2928
this.overlay = true;
3029
}
31-
preBuild() {
32-
if (!mapboxgl.Map.prototype.mapExtendAddLayerBak) {
33-
mapboxgl.Map.prototype.mapExtendAddLayerBak = mapboxgl.Map.prototype.addLayer;
34-
mapboxgl.Map.prototype.addLayer = function (layer, before) {
35-
if(!mapboxgl.Map.prototype.$l7scene) {
36-
mapboxgl.Map.prototype.$l7scene = getL7Scene(Scene, Mapbox, this);
37-
}
38-
this.mapExtendAddLayerBak(layer, before);
39-
return this;
40-
};
41-
}
42-
}
4330
/**
4431
* @function L7Layer.prototype.getL7Layer
4532
* @description 获取@antv/L7的layer实例。
@@ -68,14 +55,22 @@ export class L7Layer {
6855
visibility ? this.l7layer.show() : this.l7layer.hide();
6956
this.map.style.setLayoutProperty(this.id, 'visibility', visibility ? 'visible' : 'none');
7057
}
58+
addSceneLayer(scene) {
59+
this.scene = scene;
60+
this.scene.addLayer(this.l7layer);
61+
}
7162

7263
onAdd(map) {
7364
this.map = map;
74-
const scene = map.$l7scene;
75-
if (scene) {
76-
this.scene = scene;
77-
this.scene.addLayer(this.l7layer);
65+
if (!map.$l7scene) {
66+
const scene = getL7Scene(Scene, Mapbox, map);
67+
map.$l7scene = scene;
68+
scene.on('loaded', () => {
69+
this.addSceneLayer(scene);
70+
})
71+
return;
7872
}
73+
this.addSceneLayer(map.$l7scene)
7974
}
8075
remove() {
8176
this.scene && this.scene.removeLayer(this.l7layer);
@@ -106,13 +101,13 @@ export class L7Layer {
106101
*/
107102
mapboxgl.Map.prototype.getL7Scene = function () {
108103
return new Promise((resolve) => {
109-
if (mapboxgl.Map.prototype.$l7scene) {
110-
resolve(mapboxgl.Map.prototype.$l7scene);
111-
return mapboxgl.Map.prototype.$l7scene;
104+
if (this.$l7scene) {
105+
resolve(this.$l7scene);
106+
return this.$l7scene;
112107
}
113108
const scene = getL7Scene(Scene, Mapbox, this);
114109
scene.on('loaded', () => {
115-
mapboxgl.Map.prototype.$l7scene = scene;
110+
this.$l7scene = scene;
116111
resolve(scene);
117112
return scene;
118113
});

src/maplibregl/overlay/L7Layer.js

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import maplibregl from 'maplibre-gl';
1919

2020
export class L7Layer {
2121
constructor({ type, options }) {
22-
this.preBuild();
2322
this.type = 'custom';
2423
this.id = options && options.layerID ? options.layerID : CommonUtil.createUniqueID('l7_layer_');
2524
const _options = { ...(options || {}) };
@@ -28,18 +27,7 @@ export class L7Layer {
2827
}
2928
this.overlay = true;
3029
}
31-
preBuild() {
32-
if (!maplibregl.Map.prototype.mapExtendAddLayerBak) {
33-
maplibregl.Map.prototype.mapExtendAddLayerBak = maplibregl.Map.prototype.addLayer;
34-
maplibregl.Map.prototype.addLayer = function (layer, before) {
35-
if (!maplibregl.Map.prototype.$l7scene && layer.hasOwnProperty('l7layer')) {
36-
maplibregl.Map.prototype.$l7scene = getL7Scene(Scene, Maplibre, this);
37-
}
38-
this.mapExtendAddLayerBak(layer, before);
39-
return this;
40-
};
41-
}
42-
}
30+
4331
/**
4432
* @function L7Layer.prototype.getL7Layer
4533
* @description 获取@antv/L7的layer实例。
@@ -69,13 +57,22 @@ export class L7Layer {
6957
this.map.style.setLayoutProperty(this.id, 'visibility', visibility ? 'visible' : 'none');
7058
}
7159

60+
addSceneLayer(scene) {
61+
this.scene = scene;
62+
this.scene.addLayer(this.l7layer);
63+
}
64+
7265
onAdd(map) {
7366
this.map = map;
74-
const scene = map.$l7scene;
75-
if (scene) {
76-
this.scene = scene;
77-
this.scene.addLayer(this.l7layer);
67+
if (!map.$l7scene) {
68+
const scene = getL7Scene(Scene, Maplibre, map);
69+
map.$l7scene = scene;
70+
scene.on('loaded', () => {
71+
this.addSceneLayer(scene);
72+
})
73+
return;
7874
}
75+
this.addSceneLayer(map.$l7scene)
7976
}
8077
remove() {
8178
this.scene && this.scene.removeLayer(this.l7layer);
@@ -104,15 +101,15 @@ export class L7Layer {
104101
*/
105102
maplibregl.Map.prototype.getL7Scene = function () {
106103
return new Promise((resolve) => {
107-
if (maplibregl.Map.prototype.$l7scene) {
108-
resolve(maplibregl.Map.prototype.$l7scene);
109-
return maplibregl.Map.prototype.$l7scene;
104+
if (this.$l7scene) {
105+
resolve(this.$l7scene);
106+
return this.$l7scene;
110107
}
111108
const scene = getL7Scene(Scene, Maplibre, this);
112109
scene.on('loaded', () => {
113-
maplibregl.Map.prototype.$l7scene = scene;
110+
this.$l7scene = scene;
114111
resolve(scene);
115-
return maplibregl.Map.prototype.$l7scene;
112+
return scene;
116113
});
117114
});
118115
};

test/mapboxgl/overlay/L7LayerSpec.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,13 @@ describe('mapboxgl L7Layer', () => {
8484
});
8585

8686
it('getL7Scene', (done) => {
87+
map.getL7Scene().then((scene) => {
88+
expect(scene).not.toBeNull();
89+
done();
90+
});
91+
});
92+
93+
it('getL7Scene1', (done) => {
8794
var layer = new L7Layer({ type: 'PointLayer' });
8895
var l7Layer = layer.getL7Layer();
8996
l7Layer
@@ -99,7 +106,6 @@ describe('mapboxgl L7Layer', () => {
99106
.animate(true)
100107
.size(56)
101108
.color('#4cfd47');
102-
expect(mapboxgl.Map.prototype.$l7scene).not.toBeNull();
103109
map.getL7Scene().then((scene) => {
104110
expect(scene).not.toBeNull();
105111
done();
@@ -136,6 +142,7 @@ describe('mapboxgl L7Layer', () => {
136142
strokeWidth: 2
137143
});
138144
map.addLayer(layer);
145+
expect(map.$l7scene).not.toBeUndefine();
139146
expect(l7Layer).not.toBeNull();
140147
expect(layer.type).toBe('custom');
141148
map.removeLayer(layer.id);

test/maplibregl/overlay/L7LayerSpec.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,12 @@ describe('maplibregl L7Layer', () => {
7979
document.body.removeChild(testDiv);
8080
map = null;
8181
});
82-
82+
it('getL7Scene', (done) => {
83+
map.getL7Scene().then((scene) => {
84+
expect(scene).not.toBeNull();
85+
done();
86+
});
87+
});
8388
it('getL7Scene', (done) => {
8489
var layer = new L7Layer({ type: 'PointLayer' });
8590
var l7Layer = layer.getL7Layer();
@@ -96,7 +101,6 @@ describe('maplibregl L7Layer', () => {
96101
.animate(true)
97102
.size(56)
98103
.color('#4cfd47');
99-
expect(maplibregl.Map.prototype.$l7scene).not.toBeNull();
100104
map.getL7Scene().then((scene) => {
101105
expect(scene).not.toBeNull();
102106
done();
@@ -133,6 +137,7 @@ describe('maplibregl L7Layer', () => {
133137
strokeWidth: 2
134138
});
135139
map.addLayer(layer);
140+
expect(map.$l7scene).not.toBeUndefine();
136141
expect(l7Layer).not.toBeNull();
137142
expect(layer.type).toBe('custom');
138143
map.removeLayer(layer.id);

0 commit comments

Comments
 (0)