IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Angular Discussion :

Appeler un composant Leaflet plusieurs fois


Sujet :

Angular

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 78
    Points : 46
    Points
    46
    Par défaut Appeler un composant Leaflet plusieurs fois
    Quand j'appelle mon composant une fois ca fonctionne :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <map-affiche [lat]="lat" [lng]="lng"></map-affiche>

    mais quand je l'appelle plusieurs fois j'ai une erreur :
    "Map container is already initialized."
    html :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <div id="map" class="center"></div>

    typescript :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      @Input() lat: number;
      @Input() lng: number;
     
      ngOnInit() {
        const map = L.map('map', {
          center: [this.lat, this.lng],
          zoom: 19,
          attributionControl: false
        });
       }
    Avez vous une idée ? Merciiiiiiiiii

    ps : j'ai essayé de rendre dynamic le container mais en vain :

    html :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <div id="{{ 'map' + id }}" class="center"></div>

    typescript :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        let variable = 'map' + this.id;
     
        var map = L.map(this[variable], {
          center: [this.lat, this.lng],
          zoom: 19,
          attributionControl: false
        });

  2. #2
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private map;
    ...
    ...
     this.map = L.map(....
    ...

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 78
    Points : 46
    Points
    46
    Par défaut
    Merci beaucoup dukoid !!! Mais rien à faire (même en déclarant la variable en private)... avec plusieurs appels sur ce component j'ai le message ERROR Error: "Map container not found."

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2019
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2019
    Messages : 707
    Points : 1 030
    Points
    1 030
    Par défaut
    n'utilise pas l'ajout de id, ce n'est pas necessaire

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 78
    Points : 46
    Points
    46
    Par défaut
    Merci @krakatoa !!! Mais si je n'utilise pas les variables dynamiques j'obtiens ce message d'erreur :

    "Map container is already initialized."

    composant père (appelé plusieurs fois) :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <map-affiche [lat]="lat" [lng]="lng"></map-affiche>

    composant enfant :

    html :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <div id="map" class="center"></div>

    typescript :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      @Input() lat: number;
      @Input() lng: number;
     
       private map;
     
      ngOnInit() {
        this.map = L.map('map', {
          center: [this.lat, this.lng],
          zoom: 19,
          attributionControl: false
        });
       }

  6. #6
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      private map;
    ...
    ...
     
     
        const container = L.DomUtil.get('map');
        if (container != null) {
          container._leaflet_id = null;
        }
     
        this.map = L.map(...

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 78
    Points : 46
    Points
    46
    Par défaut
    ahhhhhhh dukoid... ca pourra sûrement corriger mon erreur !!! reste plus qu'à comprendre pourquoi j'ai :

    Property '_leaflet_id' does not exist on type 'HTMLElement'

  8. #8
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2019
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2019
    Messages : 707
    Points : 1 030
    Points
    1 030
    Par défaut
    chez moi aucune erreur!

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 78
    Points : 46
    Points
    46
    Par défaut
    Krakatoa ... j'arrive !!!!!!!!!!!!! ;-)


    Angular 8 ?
    Leaflet 1.6.0 ?

    import * as L from 'leaflet';

  10. #10
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    map.component.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    <div class="map-container">
      <div class="map-frame">
        <div id="map"></div>
      </div>
    </div>
     
     
    import { Component, OnInit, AfterViewInit } from '@angular/core';
    import * as L from 'leaflet';
     
    @Component({
      selector: 'app-map',
      templateUrl: './map.component.html',
      styleUrls: ['./map.component.css']
    })
    export class MapComponent implements OnInit  {
      private map;
     
      constructor() { }
     
      ngOnInit() {
        this.initMap();
      }
     
      private initMap(): void {
        const tiles = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
          maxZoom: 19,
          attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
        });
     
        const container = L.DomUtil.get('map');
        if (container != null) {
          container._leaflet_id = null;
        }
     
        this.map = L.map('map', {
          center: [ 39.8282, -98.5795 ],
          zoom: 3
        });
     
        tiles.addTo(this.map);
      }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <app-map></app-map>
    <hr>
    <app-map></app-map>
    "leaflet": "1.5.1"
    Angular 9

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 78
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par dukoid Voir le message
    map.component.
    Merci pour ton aide dukoid !!! mais impossible de faire marcher container._leaftlet_id = null !!!

    Property '_leaflet_id' does not exist on type 'HTMLElement'.ts(2339)


    En quick fix j'ai :

    - declare property '_leaflet_id'
    - add index signature for property '_leaflet_id'

    j'ai testé les deux (mise à jour du lib.dom.d.ts) mais ca s'incidente au npm start

  12. #12
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       const container = L.DomUtil.get('map');
        if (container != null) {
     
    console.log(container);      // essaye de voir si _leaflet_id    se nomme différemment !!!
     
    container._leaflet_id = null;
        }

  13. #13
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 78
    Points : 46
    Points
    46
    Par défaut
    Ahhhh ouiiii je vois bien _leaflet_id dans le console.log(container) !!!
    c'est peut être bon signe ;-)

    div#map​
    __zone_symbol__blurfalse: Array [ {…} ]
    ​__zone_symbol__clickfalse: Array [ {…} ]
    ​__zone_symbol__contextmenufalse: Array [ {…} ]
    ​__zone_symbol__dblclickfalse: Array [ {…} ]
    ​__zone_symbol__focusfalse: Array [ {…} ]
    ​__zone_symbol__keydownfalse: Array [ {…} ]
    ​__zone_symbol__keypressfalse: Array [ {…} ]
    ​__zone_symbol__keyupfalse: Array [ {…} ]
    ​__zone_symbol__mousedownfalse: Array(4) [ {…}, {…}, {…}, … ]
    ​__zone_symbol__mousemovefalse: Array [ {…} ]
    ​__zone_symbol__mouseoutfalse: Array [ {…} ]
    ​__zone_symbol__mouseoverfalse: Array [ {…} ]
    ​__zone_symbol__mouseupfalse: Array [ {…} ]
    ​__zone_symbol__pointerdownfalse: Array(3) [ {…}, {…}, {…} ]
    ​__zone_symbol__pointerupfalse: Array [ {…} ]
    ​__zone_symbol__scrollfalse: Array [ {…} ]
    ​__zone_symbol__wheelfalse: Array [ {…} ]
    ​_leaflet_dblclickdblclick4_2: function handler(e)​
    _leaflet_events: Object { scroll1_2: handler(e), click4_2: handler(e), dblclick4_2: handler(e)
    , … }
    _leaflet_id: 3
    _leaflet_pointerdowndblclick4_2: function onTouchStart(e)​
    _leaflet_pointerupdblclick4_2: function onTouchEnd(e)​
    _leaflet_touchstarttouchstart15_16: function ()
    ​_leaflet_touchstarttouchstart23_24: function ()
    ​accessKey: ""
    ​accessKeyLabel: ""
    ​align: ""
    ​assignedSlot: null
    ​attributes: NamedNodeMap(5) [ _ngcontent-fip-c6="", id="map", class="leaflet-container leaflet-touch leaflet-fade-anim leaflet-grab leaflet-touch-drag leaflet-touch-zoom", … ]
    ​baseURI: "http://localhost:4200/"
    ​childElementCount: 2
    ...

  14. #14
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    https://asymmetrik.com/ngx-leaflet-t...l-angular-cli/

    une astuce qui vaut de l'or : angular 8 LEAFLET
    https://github.com/search?q=angular+8+LEAFLET

    tu clones des projets, ensuite: npm install
    plus qu'à tester ensuite mettre en double , re tester !

  15. #15
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 78
    Points : 46
    Points
    46
    Par défaut
    Après recherche approfondie.... j'ai pu réussir sur mon appli et j'ai mis en place une mini version sur stackblitz : https://stackblitz.com/edit/angular-ivy-jtreqk

    me reste plus qu'à trouver un léger bug : tant que je ne bouge pas la souris, la map ne se charge pas entièrement !!! sûrement une histoire de invalidateSize à placer au bon endroit...

    @dukoid : mon problème de _leaflet_id venait d'un package superflue que j'ai supprimé : "@types/leaflet": "^1.5.12"
    (je n'ai plus souvenir pourquoi je l'avais installé)
    merci encore pour ton aide !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment reproduire un graphique identique plusieurs fois sur excel ?
    Par Lenin dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/01/2011, 16h27
  2. Réponses: 0
    Dernier message: 16/12/2010, 16h38
  3. Réponses: 11
    Dernier message: 02/02/2005, 12h52
  4. [Servlet] Comment utilisé une servlet plusieurs fois ?
    Par gandalf_le_blanc dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 03/06/2004, 14h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo