2011-06-09 8 views
0

J'ai ces classes/code Javascript:jQuery Ajax avec des classes

function PageManager() { 
    this.digital_channels = undefined; 

    this.loadConfiguration = function() { 
     this.digital_channels = new Array(); 
     var self = this; 

     $.ajax ("path_to_server", 
       { 
        type: "post", 
        cache: true, 
        context: self, 
        success: function (data) { 
         var self = $(this); 
         $xmlDoc = $($.parseXML (data)); 
         $xmlDoc.find ("channel".each (function() { 
          self.digital_channels.push (new DigitalChannel ($(this))); 
         }); 
        } 
       }); 
    } 
} 

function DigitalChannel ($xmlDoc) { 
    // Object: parse XML and construct here 
} 

A l'intérieur de la méthode de réussite AJAX, var self = $(this); est ma tentative de sauver ce que je pensais être l'objet de classe. self.digital_channels.push (new DigitalChannel ($(this))); est supposé construire un nouvel objet DigitalChannel avec $(this) étant l'objet XML DOM actuel. Je veux que ce nouvel objet entre dans mon tableau. Le tableau est toujours indéfini à ce stade.

Quelqu'un peut-il expliquer comment je fais cela?

+0

Javascript n'a pas de cours. –

+1

pourquoi définissez-vous le tableau comme non défini? Puisque c'est un var privé, vous pouvez le définir comme un tableau vide. – jukempff

+0

L'idée générale est que je le veux indéfini jusqu'à ce que je charge la configuration pour que je sache que la configuration n'est pas chargée. – Nik

Répondre

1

Votre mélange et compliquer les choses ici. Essayez ce qui suit:

function PageManager() 
{ 
    this.digital_channels = undefined; 
    this.loadConfiguration = function() { 
    this.digital_channels = new Array(); 
    //var self = this; // Remove this 

    $.ajax ("path_to_server", 
      { 
       type: "post", 
       cache: true, 
       context: this, // Change to `this` 
       success: function (data) { 
        var that = this; // instance of PageManager 
        $xmlDoc = $($.parseXML(data)); 
        $xmlDoc.find ("channel").each (function() { 
         that.digital_channels.push (new DigitalChannel ($(this))); 
        }); 
       } 
      }); 
    } 
} 
+0

Fonctionne également. Merci aussi, je me suis dit que je devais rendre les choses plus difficiles qu'elles ne l'étaient en réalité. – Nik

2

Je pense que vous devez supprimer la ligne var self = $(this); de la fonction de succès. self est déjà défini avant la requête ajax et contiendra la référence à votre objet PageManager. Cette variable de référence devrait également pouvoir être utilisée dans le gestionnaire de succès.

+0

Merci, je vais devoir enquêter sur "la portée de la fermeture" maintenant. – Nik