2008-08-14 36 views
1

我建立的列表/網格控制在Flex應用程序,並在.NET Web應用程序使用它。爲了使長篇小說變得簡單,我從序列化對象的web服務中獲取XML。我對頁面上有多少內容有限制。我採用了數據網格並將其製作成頁面,對頁面進行排序,並處理一些基本的過濾。刪除/在E4X更換一個節點(AS3 - 的Flex)

在問候傳呼我使用鍵控頁面上的字典和存儲該頁面的XML。通過這種方式,無論用戶何時回到我保存到本字典的頁面,我都可以從本地內存中獲取XML,而不是擊中Web服務。基本上,我將從每次調用中檢索到的數據緩存到webservice以獲取一頁數據。

有幾件事情可以過期我的緩存。過濾和分類是主要原因。但是,用戶可以通過打開編輯器來編輯網格中的一行數據。他們編輯的數據可能會導致行中顯示的數據過時。我可以輕鬆地訪問web服務並獲取整個頁面的數據,但由於頁面大小是在運行時設置的,我可能正在查看大量記錄以進行檢索。

所以現在讓我去,我遇到的問題的心臟。爲了防止重新獲得整個頁面的數據,我調用web服務來請求完整更新的記錄(編輯器處理保存其數據)。

由於我使用我需要序列化他們的服務器上的XML(這也已經被處理爲我們的軟件的其他部分)的自定義對象。所有數據都通過e4x中的XML處理。 Dictionary中的緩存存儲爲XMLList。

現在讓我告訴你我的代碼...

var idOfReplacee:String = this._WebService.GetSingleModelXml.lastResult.*[0].*[0][email protected]; 
var xmlToReplace:XMLList = this._DataPages[this._Options.PageIndex].Data.(@Id == idOfReplacee); 

if(xmlToReplace.length() > 0) 
{ 
    delete (this._DataPages[this._Options.PageIndex].Data.(@Id == idOfReplacee)[0]); 
    this._DataPages[this._Options.PageIndex].Data += this._WebService.GetSingleModelXml.lastResult.*[0].*[0]; 
} 

基本上,我得到了我想要替換節點的ID。然後我在緩存的Data屬性中找到它(XMLList)。我確定它存在,因爲第二行的過濾器返回XMLList

我遇到的問題是刪除線。我不能讓該行從列表中刪除該節點。刪除行後面的行起作用。我已將該節點添加到列表中。

如何替換或刪除該節點(即從緩存的.Data屬性中的filter語句中找到的節點)?

希望我的所有變量的下劃線時,這是貼不留逃脫!否則this.&#95 == this ._

回答

0

我沒有立即看到這個問題,所以我只能大膽猜測。 delete行有你正在尋找第一個項目在頂級的列表中有一個屬性「Id」的值等於idOfReplacee。確保您不需要深入挖掘XML結構以找到匹配的ID。 (Data後注意額外的 '')

delete (this._DataPages[this._Options.PageIndex].Data..(@Id == idOfReplacee)[0]); 

試試這個。您可以通過在您發佈的代碼的第二行設置一個斷點來更輕鬆地進行調試,並確保XMLList看起來像您期望的那樣。

1

也許你可以用replace代替?

var oldNode : XML = this._DataPages[this._Options.PageIndex].Data.(@Id == idOfReplacee)[0]; 
var newNode : XML = this._WebService.GetSingleModelXml.lastResult.*[0].*[0];  

oldNode.parent.replace(oldNode, newNode); 
2

感謝您的答案傢伙。

@Theo: 我試過替換幾種不同的方法。出於某種原因,它永遠不會出錯,但絕不會更新列表。

@Matt: 我想出了一個解決方案。這個問題不是來自於你的建議,而是來自刪除如何與列表一起工作(至少我是如何在這種情況下)。

_DataPages字典對象的Data屬性是定義節點的列表(由之前的另一個XML文檔過濾得到)。

<Models> 
    <Definition Id='1' /> 
    <Definition Id='2' /> 
</Models> 

最後我做這個小交易:

//gets the index of the node to replace from the same filter 
var childIndex:int = (this._DataPages[this._Options.PageIndex].Data.(@Id == idOfReplacee)[0]).childIndex(); 
//deletes the node from the list 
delete this._DataPages[this._Options.PageIndex].Data[childIndex]; 
//appends the new node from the webservice to the list 
this._DataPages[this._Options.PageIndex].Data += this._WebService.GetSingleModelXml.lastResult.*[0].*[0]; 

所以基本上我得節點的索引是數據屬性的XMLList。從那裏我可以使用delete關鍵字從列表中刪除它。 + =將我的新節點添加到列表中。

我很習慣使用ActiveX或Mozilla XmlDocument的東西,你稱之爲「SelectSingleNode」,然後用「replaceChild」做這種東西。哦,至少這是在一些其他人可以找到它的論壇。我不知道當我回答自己的問題時會發生什麼情況。也許這種洞察力會幫助別人出現並幫助更好地回答這個問題!

1

我知道這是一個令人難以置信的舊問題,但我沒有看到(我認爲是)這個問題的最簡單的解決方案。

Theo在這裏有正確的方向,但是在替換方式中使用的方式存在一些錯誤(事實上E4X中的幾乎所有東西都是一個函數)。

我相信這將這樣的伎倆:

oldNode.parent().replace(oldNode.childIndex(), newNode); 

replace()可以採取許多不同類型的第一個參數,但據我所知,XML對象是不是其中之一。