2009-05-21 10 views
3

Je n'arrive pas à obtenir la bonne portée dans la classe Ajax.Request du prototype. Ce que je suis en train de faire est d'écrire une API simple qui enveloppe les demandes ajax:Portée Prototype et Ajax.Request

API = Class.create({ 

    initialize:function(api_token) 
    { 
    this.api_token = api_token; 
    this.request_uri = new Template('/api/#{api_token}/#{resource}.json'); 
    this.status = 0; 
    this.last_result = null; 
    }, 

    some_api_call:function() 
    { 
    var result = this._request('resource', {'id':1}); 
    // and so on... 
    }, 

    _request:function(resource, params) 
    { 
    var uri = this.request_uri.evaluate({"api_token":this.api_token,"resource":resource}); 
    new Ajax.Request(uri, 
    { 
     contentType:'application/json', 
     method:'get', 
     parameters:params, 
     onSuccess:function(r) 
     { 
     alert(this); 
     this.last_result = r.responseJSON; 
     this.status = r.status; 
     } 
    });  
    return this.last_result; 
    } 

}); 

Quand je suis dans la méthode onSuccess() Je pensais + ce + pour se référer à l'objet parent, mais il me donne DOMWindow. Je n'arrive pas à obtenir ces données de réponse dans la classe API du tout. Je me dis que c'est quelque chose de stupide (contraignant?), Mais je n'arrive pas à le penser aujourd'hui.

Merci

Répondre

8

bien. J'ai raté le plus gros problème. Je demandais asynchrone donc était en définissant le résultat, mais pas immédiatement. Pour être juste, c'était aussi une question contraignante. Voici la bonne demande:

_request:function(resource, params) 
{ 
    var uri = this.request_uri.evaluate({"api_token":this.api_token,"resource":resource}); 
    new Ajax.Request(uri, 
    { 
    asynchronous: false, 
    contentType:'application/json', 
    method:'get', 
    parameters:params, 
    onSuccess:function(r) 
    { 
     this.last_result = r.responseJSON; 
     this.status = r.status; 
    }.bind(this) 
    });  

    alert(this.status); 

    return this.last_result; 
} 
0

Votre solution ne devrait PAS fonctionner?

Vous devez utiliser des variables locales ci-dessus la fonction imbriquée, puis les convertir dans le champ « ceci »:

_request:function(resource, params) 
    { 
     var uri = this.request_uri.evaluate({"api_token":this.api_token,"resource":resource}); 
     var last_result = ""; 
     var status = ""; 
     new Ajax.Request(uri, 
     { 
     asynchronous: false, 
     contentType:'application/json', 
     method:'get', 
     parameters:params, 
     onSuccess:function(r) 
     { 
      last_result = r.responseJSON; 
      status = r.status; 
     } 
     }); 
     this.last_result = last_result; 
     this.status = status; 
     alert(this.status); 
     return this.last_result; 
    }