2009-05-21 104 views
3

我无法在原型的Ajax.Request类中获取正确的作用域。我正在试图做的是写一个简单的API,它包装的Ajax请求:原型和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; 
    } 

}); 

当我在我预期的onSuccess()方法是+这+来指代父对象,但它给我DOMWindow。我似乎无法将该响应数据放入API类中。我认为这是愚蠢的(绑定?),但我似乎今天似乎无法想到这一个。

谢谢

回答

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