2013-07-26 30 views
2

我不真的明白爲什麼我的變量是未定義 這是我的代碼:的JavaScript和AJAX回調

Calendar = function() { 

    this.data; 
    this.init = function(path, callback){ 
     $.ajax({ 
      url:path, 
      type:'GET', 
      success:function(data){ 
       this.data = data; 
       console.log(this.data); 
       callback(); 
      } 
     }) 
    } 

    this.create = function(){ 
     this.generateYear(); 
    } 

    this.generateYear = function(){ 
     console.log(this.data); 
    } 
} 

我用它是這樣的:

$(document).ready(function(){ 
    var calendar = new Calendar(); 
    calendar.init(path,function(){ 
     calendar.create(); 
    }); 
}); 

所以第一個控制檯。日誌很好,但第二個是未定義的,我不明白爲什麼,因爲他被叫了。

感謝您的幫助

+0

可能重複的[如何從AJAX調用返回響應?](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an- ajax-call) – elclanrs

+0

@elclanrs看起來不像這個,有 –

+0

什麼是'callback();'之後第一個'console.log(this.data);' – Paritosh

回答

5

組上下文PARAM。試試這個:

$.ajax({ 
     url:path, 
     type:'GET', 
     context: this, 
     success:function(data){ 
      this.data = data; 
      console.log(this.data); 
      callback(); 
     } 
    }) 
+0

@MichaelWalter'context'。它看起來是一個很好的答案。從我+1。 –

+0

哎呀。刪除了我的評論。感謝您的答案 –

+0

感謝您的答案,它的工作原理 – Ajouve

3

this,在你給阿賈克斯的回調,是不是你的日曆。

更改您的初始化函數在阿賈克斯功能

this.init = function(path, callback){ 
    var calendar = this; 
    $.ajax({ 
     url:path, 
     type:'GET', 
     success:function(data){ 
      calendar.data = data; 
      console.log(calendar.data); 
      callback(); 
     } 
    }) 
} 
+0

謝謝這是一個很好的答案,但我更喜歡邁克爾的答案,我覺得這更合適 – Ajouve

+0

@ant我個人真的更喜歡始終牢記本機基於閉包解決辦法比試圖記住'ajax'函數的所有參數。但他的回答也很好(我贊成),所以我不會責備你選擇它。只需確保理解我的答案,因爲這是您在所有其他類似案例中使用的解決方案:) –

+1

@ant消息答案更具可讀性。邁克爾的答案使用'this'會使混亂 – rab

0

在this.generateYear您的來電「這」是不是更引用日曆對象,並引用其中最有可能沒有數據作爲屬性Window對象。請確保您閱讀了更多有關Javascript binding

將此實例存儲在對象中的一個變量中,並稍後使用它將會起作用。示例:

this.init = function(path, callback){ 
    var self = this; 
    $.ajax({ 
     url:path, 
     type:'GET', 
     success:function(data){ 
      self.data = data; 
      console.log(self.data); 
      callback(); 
     } 
    }) 
}