2009-11-08 100 views
0

为什么不能在ajax成功返回时访问渲染函数?也许我会疯了,但我以前做过。javascript undefined

它告诉我,this.render不是一个函数?

DataItem.prototype = { 
    display: function() { 
     $('body').append(this.name + ": " + this.getData(this.rootData, this.subData) + "<br />"); 
    }, 
    getData: function (rootData, subData) { 
     $.ajax({ 
      type: "GET", 
      url: "json/data.js", 
      data: "", 
      dataType: "json", 
      success: function (json){ 
       this.render(json); 
      } 
     }); 
    }, 
    render: function (json) { 
     var res = []; 
     for(var i=0, t; t=json.log.entries[i]; i++) { 
      var p = t.request.url; 
      if (p!=undefined) res.push(p); 
     } 
     return res.length; 
    } 
}; 
+0

以及您如何使用该功能? – 2009-11-08 12:35:11

+0

@Alan - 你可以显示DataItem的完整代码吗? – 2009-11-08 12:43:22

回答

5

当您尝试呼叫this.render()时,示波器已更改。我相信this包含ajax请求对象而不是DataItem对象。

一个简单的办法是做这样的:

getData: function (rootData, subData) { 
    var self = this; 
    $.ajax({ 
     type: "GET", 
     url: "json/data.js", 
     data: "", 
     dataType: "json", 
     success: function (json){ 
      self.render(json); 
     } 
    }); 
}, 

编辑:我错了,成功的功能this变量包含Ajax请求的选项里面,但是我的解决方案仍然是正确的。在jQuery文档中查看更多(http://docs.jquery.com/Ajax/jQuery.ajax#options

1

刚刚添加到@adamse的答案。如果您想要外部化您的success功能而不是使用匿名函数,你可以使用下面的传递额外的参数:

function handleSuccess(json) { 
    this.self.render(json); 
} 

$(function() { 
    $.ajax({ 
     type: "GET", 
     url: "json/data.js", 
     data: "", 
     dataType: "json", 
     // pass an additional parameter to the success callback 
     self: this, 
     success: handleSuccess 
    }); 
}); 
+0

谢谢,那就是我想要的:) – Alan 2009-11-08 12:54:47

0

,因为下面的代码工作(即“ABCD”打印),我不知道是什么是你面对的问题,除非你会分享更多的代码。

<script> 
    DataItem = function(){}; 
    DataItem.prototype = { 
     display: function() { 
      return 'a'; 
     }, 
     getData: function() { 
      document.write(this.render()); 
      return this; 
     }, 
     render: function() { return "abcd"; } 
    }; 


    di = new DataItem(); 
    di.getData(); 

</script>