Frage

Ich habe Probleme mit dem korrekten Umfang bekommen Ajax.Request Klasse innerhalb des Prototyps. Was ich versuche, eine einfache API zu tun ist, schreiben die AJAX-Anfragen wickelt:

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

});

Wenn ich in der onSuccess () Methode, die ich erwartete + dieses + auf das übergeordnete Objekt zu verweisen, aber es gibt mir DOMWindow. Ich kann überhaupt nicht, dass die Antwortdaten in die API-Klasse zu bekommen scheinen. Ich vermute, es ist etwas dumm ist (Bindung?), Aber ich kann einfach nicht scheinen, dieses zu denken, aus heute.

Danke

War es hilfreich?

Lösung

Okay. Ich vermisste das größere Problem. Ich beantrage asynchron, so dass es wurde das Ergebnis einstellen, nur nicht sofort. Um fair zu sein, es war auch ein verbindliches Thema. Hier ist die richtige Anfrage:

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

Andere Tipps

Ihre Lösung sollte nicht?

Sie müssen lokale Variablen über die verschachtelte Funktion verwenden und diese dann umwandeln in die ‚this‘ Anwendungsbereich:

 _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;
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top