Question

Je vais avoir du mal à obtenir la portée correcte au sein de la classe Ajax.Request de prototype. Ce que je suis en train de faire est d'écrire une API simple qui enveloppe les demandes ajax:

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 ne peux pas sembler obtenir que les données de réponse dans la classe API du tout. Je dis qu'il est quelque chose de stupide (contraignant?), Mais je ne peux pas sembler penser celui-ci aujourd'hui.

Merci

Était-ce utile?

La solution

D'accord. J'ai raté le plus gros problème. Je lui ai demandé de manière asynchrone il est Configuration du résultat, mais pas immédiatement. Pour être juste, il était aussi un problème de liaison. Voici la demande appropriée:

_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;
}

Autres conseils

Votre solution ne doit pas travailler?

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;
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top