【问题标题】:Prototype and Ajax.Request scope原型和 Ajax.Request 范围
【发布时间】:2014-03-08 05:14:04
【问题描述】:

我无法在原型的 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() 方法中时,我希望 +this+ 引用父对象,但它给了我 DOMWindow。我似乎根本无法将该响应数据放入 API 类中。我认为这是一件愚蠢的事情(绑定?),但我今天似乎想不出这个。

谢谢

【问题讨论】:

    标签: javascript ajax prototypejs


    【解决方案1】:

    好的。我错过了更大的问题。我是异步请求的,所以它 设置了结果,而不是立即设置。公平地说,这也是一个具有约束力的问题。这是正确的要求:

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

    【讨论】:

      【解决方案2】:

      您的解决方案应该不起作用?

      你需要在嵌套函数上方使用局部变量,然后将它们转换成'this'作用域:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-22
        • 2010-12-16
        • 1970-01-01
        • 2015-06-19
        • 2012-10-24
        • 1970-01-01
        • 2012-03-28
        相关资源
        最近更新 更多