Skip to content

Commit 723a0de

Browse files
committed
correction map_service
1 parent 295d8cd commit 723a0de

1 file changed

Lines changed: 29 additions & 7 deletions

File tree

frontend/src/components/map/map-service.js

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ class MapService {
7676
_id; // map id
7777
_config; // configuration
7878
_map = null; // map leaflet object
79+
_resizeObserver = null; // observe le conteneur pour ne recalculer la taille que si elle change réellement
7980

8081
baseModel = {};
8182

@@ -95,6 +96,10 @@ class MapService {
9596
* qui s'accumulent au fil des navigations et finissent par saturer la mémoire du navigateur.
9697
*/
9798
destroy = function () {
99+
if (this._resizeObserver) {
100+
this._resizeObserver.disconnect();
101+
this._resizeObserver = null;
102+
}
98103
if (this._map) {
99104
this._map.remove();
100105
this._map = null;
@@ -117,7 +122,7 @@ class MapService {
117122
* 6. Initialise les fonds de tuiles (tiles) de la carte.
118123
* 7. Initialise les couches supplémentaires (layers).
119124
* 8. Initialise les marqueurs sur la carte.
120-
* 9. Corrige la taille de la carte à différents intervalles pour éviter les bugs d'affichage liés aux animations ou aux requêtes asynchrones.
125+
* 9. Observe le conteneur et corrige la taille de la carte quand elle change réellement.
121126
*
122127
* @returns {boolean} true si l'initialisation a réussi, false sinon.
123128
*/
@@ -127,6 +132,13 @@ class MapService {
127132
return;
128133
}
129134

135+
// init() peut être rappelé sans destroy() (ex: watch height dans base-map.vue) ;
136+
// on coupe l'éventuel observer précédent pour ne pas en empiler plusieurs.
137+
if (this._resizeObserver) {
138+
this._resizeObserver.disconnect();
139+
this._resizeObserver = null;
140+
}
141+
130142
// 2. Crée l'objet carte Leaflet avec des options de zoom personnalisées.
131143
this._map = L.map(this._id, {
132144
zoomSnap: 0.1, // Précision du zoom (fraction de niveau de zoom)
@@ -151,12 +163,22 @@ class MapService {
151163
// 8. Initialise les marqueurs sur la carte.
152164
this.initMarkers();
153165

154-
// 9. Corrige la taille de la carte à différents intervalles pour éviter les bugs d'affichage
155-
// (utile lors d'animations ou de chargements asynchrones).
156-
for (const delay of [100, 1000, 2000, 5000, 10000]) {
157-
setTimeout(() => {
158-
this._map.invalidateSize();
159-
}, delay);
166+
// 9. Corrige la taille de la carte quand son conteneur change réellement de dimensions
167+
// (layout Vuetify qui se stabilise, panneau qui s'ouvre/ferme, etc.), au lieu de
168+
// la deviner via une salve de setTimeout qui rechargeait les tuiles en aveugle et
169+
// provoquait des annulations de requêtes (NS_BINDING_ABORTED) visibles dans Firefox.
170+
const container = document.getElementById(this._id);
171+
if (container && typeof ResizeObserver !== 'undefined') {
172+
let debounce;
173+
this._resizeObserver = new ResizeObserver(() => {
174+
clearTimeout(debounce);
175+
debounce = setTimeout(() => {
176+
if (this._map) {
177+
this._map.invalidateSize();
178+
}
179+
}, 100);
180+
});
181+
this._resizeObserver.observe(container);
160182
}
161183

162184
// Retourne true si l'initialisation s'est déroulée correctement.

0 commit comments

Comments
 (0)