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

AJAX Discussion :

this.map est undefined lors de la récupération des données


Sujet :

AJAX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2020
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2020
    Messages : 119
    Par défaut this.map est undefined lors de la récupération des données
    Bonjour,

    Ce code ci dessous me permet d'afficher une map avec des marqueurs en récupérant les datas via une API.

    Sauf que, lorsque j'ouvre le navigateur la map apparaît bien mais pas les marqueurs. La console affiche :

    Uncaught TypeError: Cannot read property 'map' of undefined
    at Map.js:40
    at Array.forEach (<anonymous>)
    at Map.js:35
    at XMLHttpRequest.<anonymous> (Map.js:20)


    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    /*------------------------------------------
    MAP
    ------------------------------------------*/
     
    class Map {
        constructor() {
            this.map = L.map('map').setView([49.8941708, 2.2956951], 13);
            this.layer = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
                attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
            }).addTo(this.map);
     
            this.checking();
        }
     
        ajaxGet(url, callback) {
            var req = new XMLHttpRequest();
            req.open("GET", url);
            req.addEventListener("load", function() {
                if (req.status >= 200 && req.status < 400) {
                    callback(req.responseText);
                } else {
                    console.error(req.status + " " + req.statusText + " " + url);
                }
            });
            req.addEventListener("error", function() {
                console.error("Erreur réseau avec l'URL " + url);
            });
            req.send(null);
        }
     
        //Ajouter Markers
        addMarkers() {
            this.ajaxGet('http://api.jcdecaux.com/vls/v1/stations?contract=amiens&apiKey=86e2bc05a438193dfbc09fcaa44634b7c6641d2c', function(reponse) {
                let datas = JSON.parse(reponse);
                datas.forEach((data) => {
                    L.marker(Object.values(data.position), {
                            "data": data
                        })
                        .addTo(this.map)
                        .on("click", this.clickEvent.bind(this, data));
                });
            });
        }
     
        clickEvent(data) {
            const formulaire = new Formulaire(new Station(data));
            formulaire.showForm();
            if (data.status === "OPEN" && data.available_bikes > 0) {
                L.marker({ icon: this.iconBleue })
            } else {
                L.marker({ icon: this.iconRouge })
            }
        }
     
        checking() {
            if (Storage.hasStationInfo()) {
                console.log('Les données stations existent');
                /*Storage.getStation();*/
                this.clickEvent(Storage.getStation());
                console.log("Station: ", Storage.getStation());
            } else {
                sessionStorage.clear();
            }
        }
     
    };
     
    const myMap = new Map(); // point d'entrée c'est içi //plusieurs classes // jai essayé de respecter les standard js // chaque class a ses focntionnalités qui lyui sont propre // class particulier dom que je reference des données statiques // j'ai chaque class qui fait ça // cointrpl d'input avec déclaration d'évènements
    myMap.addMarkers();


    est-ce un problème avec le this ? pourtant, la valeur est bien lu içi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Map {
        constructor() {
            this.map = L.map('map').setView([49.8941708, 2.2956951], 13);
            this.layer = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
                attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
            }).addTo(this.map);

    Mais pas içi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     addMarkers() {
            this.ajaxGet('http://api.jcdecaux.com/vls/v1/stations?contract=amiens&apiKey=86e2bc05a438193dfbc09fcaa44634b7c6641d2c', function(reponse) {
                let datas = JSON.parse(reponse);
                datas.forEach((data) => {
                    L.marker(Object.values(data.position), {
                            "data": data
                        })
                        .addTo(this.map)
                        .on("click", this.clickEvent.bind(this, data));
                });
            });
        }

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2020
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2020
    Messages : 119
    Par défaut
    Problème résolu, je devais simplement remplacer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            this.ajaxGet('http://api.jcdecaux.com/vls/v1/stations?contract=amiens&apiKey=86e2bc05a438193dfbc09fcaa44634b7c6641d2c', function(reponse)  {

    par



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            this.ajaxGet('http://api.jcdecaux.com/vls/v1/stations?contract=amiens&apiKey=86e2bc05a438193dfbc09fcaa44634b7c6641d2c', (reponse) => {

    ( Étonnement ça fonctionne en passant par une fonction fléché mais pas en faisant function(parametre) {} )

  3. #3
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 209
    Par défaut
    Bonjour,
    ( Étonnement ça fonctionne en passant par une fonction fléché mais pas en faisant function(parametre) {} )
    comme quoi tu as déjà oublié ce qui t'a été dit dans une de tes discussion, à savoir : Chrono JS: passer du procédural en POO, voir post #10 et #11 par exemple !

    Nota :
    Une autre discussion, il y en a pas mal d'autres d'ailleurs, très très proche de tes préoccupations du moment : Convertir une requête Ajax procédurale en objet.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2020
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2020
    Messages : 119
    Par défaut
    Effectviement je n'avais pas encore bien assimilé la distinction entre les fonctions flechés et les anciennes fonctions. Merci pour le rappel

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/08/2017, 09h11
  2. [MySQL] Récupérer la valeur d'un cookie dans une autre page du site
    Par Narutosaad dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 07/06/2010, 22h06
  3. Récupérer la valeur des champs calculés dans une requète SQL dans vba
    Par FrédéricCM dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 28/06/2006, 16h29
  4. passer la valeur d'un return dans une méthode
    Par belukrin dans le forum Langage
    Réponses: 1
    Dernier message: 25/03/2006, 06h58
  5. Récupérer les valeur d'un énuméré dans une string
    Par Oliv_75 dans le forum SL & STL
    Réponses: 5
    Dernier message: 28/09/2005, 00h55

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