2012-08-27 78 views
1

我知道標題是有點混亂,這裏是詳細信息:如何通過其他方法填充的方法訪問對象的成員?

說我有在JavaScript中定義的自定義對象,並且在它定義的公共成員:

function Test() 
{ 
    this.testArray = []; 
} 

我有兩種方法,這個對象,一個是讀了一些XML文件,並填充到數組:

Test.prototype.readXML = function() 
{ 
    var self = this; 
    $.get('assest/xml/mydata.xml', function(d){ 
    $(d).find("item").each(function(){ 
      var item = new Item; 
      item.ID = ($(this).attr("ID")); 
      item.body = ($(this).find("body").text()); 
      }); 
    self.testArray.push(item); 
    }); 
    } 

而另一個功能,這將顯示內容轉換成HTML頁面。

Test.prototype.appendInfo = function() 
    { 
    var i; 
    for (i=0; i<testArray.length;i++) 
    { 
     $('#testdisplay').append(testArray[i].ID +"<br />"); 
     $('#testdisplay').append(testArray[i].body = "<br /"); 
     } 
    } 

但是,顯示函數繼續給我錯誤,未定義testArray。我不確定問題在哪裏,因爲我將顯示功能放在了閱讀功能的後面。我期望數據將被存儲在數組中,並且可以隨時在需要時訪問它們。

希望有人會幫助我這個!謝謝! } }

回答

2

所以我注意到你的代碼有兩個問題。

首先,當您進行ajax調用時,您需要將延遲傳回給用戶。由於ajax調用是異步的,它可能不會馬上結束。

所以你的readXML函數應該這樣做。它應該返回jquery get。

Test.prototype.readXML = function() { 
    var self = this; 
    return $.get('assest/xml/mydata.xml', function(d){ 
     $(d).find("item").each(function(){ 
      var item = new Item; 
      item.ID = ($(this).attr("ID")); 
      item.body = ($(this).find("body").text()); 
     }); 
     self.testArray.push(item); 
    }); 
} 

接下來你的第二個函數追加只是缺少一些上下文。

Test.prototype.appendInfo = function() { 
    var i; 
    for (i=0; i<this.testArray.length;i++) { 
     $('#testdisplay').append(this.testArray[i].ID +"<br />"); 
     $('#testdisplay').append(this.testArray[i].body = "<br /"); 
    } 
} 

所以你的代碼應該看起來像這樣。

var mytest = new Test(); 

mytest.readXML().done(function(){ 
    mytest.appendInfo(); 
}).fail(function(){ 
    // put some fallback code here 
}); 

更新: 增加了額外的這一點。

+0

你錯過了幾個'this's – Eric

+0

謝謝@arhea 。你的方法奏效!但是我仍然有點困惑。這個解決方案意味着如果我想使用ajax的功能,我必須調用任何需要訪問讀取和存儲的數據通過ajax函數調用內部ajax傳輸的方法?就像你在代碼的最後一塊顯示我一樣。有沒有辦法,讓程序完成閱讀,比做其他工作,並把存儲變量作爲一個正常的本地靜態變量? – Arthur0902

+0

沒有ajax調用是異步的。 Javascript將繼續。這就是爲什麼需要等待ajax調用完成的所有代碼都需要在回調中。我鼓勵你閱讀所有關於jQuery Deferreds – arhea

0

您的appendInfo()函數中沒有testArray函數,這就是爲什麼它沒有定義。您應該改用this.testArray

要使用一個變量你的範圍內聲明,但您正在使用的功能外每一次,你必須使用this.yourVariable

相關問題