2010-02-24 7 views
1

J'essaie d'affecter des données JSON à une propriété d'une instance JS.Class.Affectation de portée entre jQuery.getJSON et une classe JS.Class

var MyClass = new JS.Class({ 
    initialize: function(uuid) { 
     this.uuid = uuid; 
    }, 
    write: function() { 
    $.getJSON(url+"?callback=?", {}, function(data) { 
     Assign(data); 
    }); 
    function Assign(data) { this.content = data; }; 
    } 
}); 

var m = new MyClass("uuid_goes_here"); 
m.write(); 

Le JSON est reçu de manière asynchrone, ce qui est la raison pour laquelle il y a un appel de fonction dans le rappel $.getJSON.

Le problème que j'ai maintenant est que le this.content dans la fonction Assign n'est pas dans la portée de la méthode d'instance nommée write. Donc, alors que this.uuid renvoie correctement, this.content reste indéfini (comme vous pouvez vous y attendre).

Des idées pour corriger la situation? J'ai essayé d'utiliser une variable globale comme une solution de contournement, mais l'appel asynchrone ne permet pas cela (plus c'est une solution de merde).

Certains points à noter, dans le cas où ils sont importants: Je dois utiliser JSONP, donc "? Callback =?" doit rester, et je voudrais le garder async.

Répondre

4

Je généralement aller pour les deux versions de czarchaic, ou remplacer Accept par une méthode liée à l'objet. Ce que vous devez garder à l'esprit, c'est qu'appeler Accept() comme cela (comme un appel de fonction plutôt qu'un appel de méthode) liera this à l'objet global, c'est-à-dire window. Je voudrais essayer ceci:

var MyClass = new JS.Class({ 
    initialize: function(uuid) { 
     this.uuid = uuid; 
    }, 
    write: function() { 
    $.getJSON(url+"?callback=?", {}, this.method('setContent')); 
    }, 
    setContent: function(data) { 
    this.content = data; 
    } 
}); 

Voir http://jsclass.jcoglan.com/binding.html pour plus d'informations.

+0

Cela a fonctionné parfaitement, merci! J'avais l'impression que cela aurait à voir avec la liaison, mais la bonne approche m'a échappé. – joecorcoran

+0

Juste comme un addendum: malgré la bonne solution de jcoglan, si je projetais d'écrire une nouvelle méthode d'instance qui utilise this.content, et d'appeler la nouvelle méthode directement après write(), la nature asynchrone de $ .getJSON aussi Je voulais juste que ce soit clair. – joecorcoran

+0

Comment avez-vous réussi à gérer la nature asynchrone des appels ajax, en particulier lorsque vous deviez appeler le contenu d'autres fonctions? – Haroon

0

Vous devez mettre en cache l'instance actuelle dans la méthode write et la mettre à jour après ajax.

write: function() { 
    var self=this; 
$.getJSON(url+"?callback=?", {}, function(data) { 
    self.data=data; 
}); 
} 
+0

N'est-ce pas essentiellement la même chose que la réponse de Pascal MARTIN? Je l'ai essayé et cela fonctionne, mais seulement dans le travail juste après l'appel d'ajax et plus jamais. Je veux finalement utiliser this.content dans d'autres méthodes d'instance en plus d'écrire, comme je le peux avec this.uuid. – joecorcoran

Questions connexes