2009-05-21 10 views
3

프로토 타입의 Ajax.Request 클래스 내에서 올바른 범위를 가져 오는 데 문제가 있습니다. 난 할 노력하고있어 아약스 요청을 감싸는 간단한 API를 쓸 수 있습니다 :프로토 타입 및 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; 
    }