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

JavaScript Discussion :

Callback et objets


Sujet :

JavaScript

  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut Callback et objets
    Salut a tous,

    Je me heurte à un petit problème dont je ne vois vraiment pas la raison ni la solution.

    J'ai un objet, mettons comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var asso_book_datatables = {
     
    	'datatable': function() { return 'lala'; }
     
    	'delete_entry': function() {
    		alert(this.datatable());
    	}
    };

    J'ai ma requete ajax comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var callback = asso_book_datatables.delete_entry;
    $.ajax({
    	type:     'POST',
    	success:  function(data) {
    		callback();
    	}
    });
    L'idée est relativement simple : je fais un appel ajax en passant ma première fonction en callback, mon callback étant appelé lors du success de la requete.

    Et bien ca ne marche pas ! L'erreur est "Uncaught TypeError: Object [object DOMWindow] has no method 'datatable'". Effectivement, si depuis ma méthode delete_entry (qui est bien exécutée) j'affiche this, eh bien JS me dit que c'est un objet de type... DOM Window ?? Alors que ca devrait être mon objet asso_book_datatables...

    Et, si dans mon appel ajax je remplace callback() par asso_book_datatable.delete_entry(), alors ca marche sans problème !

    La question c'est donc : pourquoi est-ce que JS ne veut pas utiliser ma variable callback pour exécuter la méthode de mon objet ? D'où vient ce DOM Windows au milieu de _mon_ objet ? Sachant qu'à d'autres endroits de mon code j'ai ce genre d'appel qui marche très bien.

    Merci !

  2. #2
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Il faut "fixer" le contexte de this :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var asso_book_datatables = {
            var that = this;
    	'datatable': function() { return 'lala'; }
     
    	'delete_entry': function() {
    		alert(that.datatable());
    	}
    };

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut
    Salut,

    Merci, effectivement il faut utiliser cette astuce. Ne pas oublier de faire un objet-fonction, parce que la en fait j'ai un objet littéral (je le savais pas :p), et la technique du that ne marche pas.

    C'est assez moche quand même le JS des fois

    Merci

  4. #4
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Citation Envoyé par winzou Voir le message
    Merci, effectivement il faut utiliser cette astuce. Ne pas oublier de faire un objet-fonction, parce que la en fait j'ai un objet littéral (je le savais pas :p), et la technique du that ne marche pas.
    Ah oui tiens j'avais pas fait attention, tu as raison, j'ai du répondre trop vite. ^^

    Citation Envoyé par winzou Voir le message
    C'est assez moche quand même le JS des fois
    Disons que j'ai rien entendu

  5. #5
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Citation Envoyé par winzou Voir le message
    C'est assez moche quand même le JS des fois
    C'est de la logique, au-delà de toute notion de moche et de beau

    Une seule règle à retenir : this c'est ce qu'il y a avant le point au moment de l'appel. Je m'explique :
    Code JS : Sélectionner tout - Visualiser dans une fenêtre à part
    asso_book_datatables.delete_entry();
    Ici, this est asso_book_datatables.
    Code JS : Sélectionner tout - Visualiser dans une fenêtre à part
    callback(); // implicitement : window.callback();
    Ici, this est window. Par conséquent, le alert(this.datatable()); se transforme en alert(window.datatable());, ce qui explique ton message d'erreur.

    Note que les fonctions ont deux méthodes natives, call et apply, qui permettent de « restaurer le contexte ».
    Code JS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    maFonction.call(contexte, arg1, arg2, etc.)
    maFonction.apply(contexte, args)

    En l'occurence :
    Code JS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var callback = asso_book_datatables.delete_entry;
    $.ajax({
    	type:     'POST',
    	success:  function(data) {
    		callback.call(asso_book_datatables);
    	}
    });
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  6. #6
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Oui, de toute manière, lorsque l'on utilise des objets comme des constructeurs (avec une certaine analogie aux classes habituelles en POO), il faut les utiliser au travers d'instances (avec le mot clé new pour définir chaque instance) et dans ce cas, this référence bien le constructeur.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

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

Discussions similaires

  1. Callback sur le focus d'un objet graphique
    Par Maickeul dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 20/07/2007, 16h00
  2. Réponses: 8
    Dernier message: 01/06/2007, 00h13
  3. Affecter un même callback à plusieurs objets
    Par pelotudo dans le forum Interfaces Graphiques
    Réponses: 6
    Dernier message: 23/05/2007, 10h23
  4. Comment fusionner plusieurs callback pour un même objet graphique
    Par biquet dans le forum Interfaces Graphiques
    Réponses: 8
    Dernier message: 19/04/2007, 10h39
  5. Réponses: 4
    Dernier message: 14/09/2006, 12h25

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