2009-05-21 2 views
3

У меня возникли проблемы с получением правильной области действия в классе Ajax.Request прототипа. То, что я пытаюсь сделать, это написать простой API, который оборачивает Ajax запросы:Prototype и Ajax.Request scope

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 вообще. Я полагаю, что это что-то глупое (обязательное?), Но я просто не могу сейчас думать об этом.

Thanks

ответ

8

Хорошо. Я пропустил большую проблему. Я запрашивал асинхронно, поэтому был, установив результат, только не сразу. Справедливости ради следует отметить, что это также является обязательным вопросом. Вот правильный запрос:

_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

Ваше решение не должно работать?

Вы должны использовать локальные переменные выше вложенной функции, а затем преобразовать их в 'этой области видимости:

_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; 
    } 
Смежные вопросы