سؤال

أواجه مشكلة في الحصول على النطاق الصحيح في فئة AJAX.Request النموذجية. ما أحاول القيام به هو كتابة API بسيطة والتي يلف طلبات 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;
  }

});

عندما أكون في طريقة Onsuccess () التي أتوقعها + هذا + للإشارة إلى الكائن الأصل، لكنه يعطيني domwindow. لا يبدو لي أن أحصل على هذه البيانات الاستجابة في فئة API على الإطلاق. أنا الرقم هو شيء غبي (ملزم؟)، لكنني فقط لا يبدو أن أعتقد أن هذا واحد خارج اليوم.

شكرا

هل كانت مفيدة؟

المحلول

تمام. فاتني المشكلة الأكبر. كنت طلب غير متزامن لذلك كنت تحديد النتيجة، فقط ليس على الفور. لتكون عادلة، كانت أيضا قضية ملزمة. هنا هو الطلب الصحيح:

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

نصائح أخرى

يجب أن لا يعمل الحل الخاص بك؟

تحتاج إلى استخدام المتغيرات المحلية فوق الوظيفة المتداخلة ثم تحويلها إلى النطاق "هذا":

 _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;
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top