2009-11-08 50 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>