2009-08-15 62 views
4

我正在使用一個數組來填充一個DataProvider,我正在使用它來填充一個列表組件。就像這樣:如何告訴DataProvider進行更新?

var myDataProvider = new DataProvider(this.myArray); 
this['list'].dataProvider = myDataProvider; 

更改時數組做,我想告訴DataProvider的更新,使這些變化將在列表組件中反映出來。如果有一種方法可以告訴DataProvider監聽數組中的更改並更新它自己,那將是一件好事,但我會解決手動更新它的方法。

我可以用一個新的DataProvider替換DataProvider,但是這個列表失去了它的選擇。我想我可以通過DataProvider並比較和修改每個條目以使其與數組匹配,但這看起來太麻煩了。有什麼辦法可以告訴DataProvider更新以匹配數組嗎?

編輯:我正在尋找一種方法來做到這一點在Flash中,而不是Flex。

回答

5

陣列在AS 3中不可綁定;他們本身不派遣/觸發數據綁定事件。

如果您正在使用Flex的工作,你可以用你在ArrayCollection其中綁定陣列,並且操縱ArrayCollection代替Array的,因爲你希望一切都應該自動工作。

因此,在實踐中:

var myAC:ArrayCollection = new ArrayCollection(myArray); 
var myDP = new DataProvider(myAC); 

myAC[0] = 'changing the array!'; // will be reflected in the dataProvider 

更重要的是,如果你傳遞的是DataProvider實例Flex組件,通常可以(幾乎總是)剛剛通過ArrayCollection代替。但是,在這方面你沒有展現足夠的背景讓我確信。

下面是一些有用的鏈接:

編輯:我的錯,我確實認爲你正在使用的Flex以上。

在普通的舊AS3中,主體是相同的。 Array不派遣事件,但DataProvider。如果您可以將您的更改添加到dataProvider本身那麼您就很好。

的AS3 DataProvider類提供了一堆的數據處理方法,如addItemremoveItemreplaceItemreplaceItemAt,只是舉例。

所以,它基本上歸結爲您需要對源數組進行哪些更改。通常情況下,您可以通過DataProvider進行操作。

+0

謝謝,但我敢肯定,ArrayCollection的是一個Flex類。有沒有辦法在Flash中獲得此功能? – Robert 2009-08-15 01:51:57

+0

感謝您的編輯。我考慮過這一點,但源數組是在不同的類中創建的,它只是作爲一個數組使用它。將它重寫爲使用DataProvider似乎有點令人費解。有沒有辦法告訴DataProvider重新配置自己以匹配更改的數組? – Robert 2009-08-15 02:15:15

+0

由於對象是通過引用傳遞的,因此DataProvider和創建Array的類都可以根據需要使用該數組,而彼此不知道。應該不需要修改其他課程。 – 2009-08-15 03:33:56

1

我花了最後4個小時試圖找出數據提供者和原始數組之間的連接是什麼。我發現在使用GetItemAt方法時,在數據網格上使用GetItemAt方法也會更新DataGrid的dataprovider所創建的數組,使其自動更新。

import fl.events.ListEvent; 
import fl.data.DataProvider; 

var arr = new Array(); 
arr.push ({Name:"Mike",Height:"6'4"}); 
arr.push ({Name:"Jackie",Height:"5'9"}); 
arr.push ({Name:"Mike",Height:"0'10"}); 

dg.addColumn("Name"); 
dg.addColumn("Height"); 
dg.dataProvider = new DataProvider(arr); 
dg.addEventListener(ListEvent.ITEM_CLICK,updatename); 

function updatename(e):void { 
e.target.getItemAt(e.rowIndex)["Name"] = name_txt.text; 
trace (arr[e.rowIndex]["Name"]); 
} 

什麼惱火的是,我使用removeItemAt方法,它刪除DataGrid行,但不更新陣列。在項目開始時,我不知道getItemAt會更新數組,所以我花了4個小時試圖弄清楚我的代碼是如何減去兩次的。

1

沿着同樣的路線,如果更新數組,它會自動更新數據網格(至少在Flash CS4中)。

import fl.events.ListEvent; 
import fl.data.DataProvider; 

var arr = new Array(); 
arr.push ({Name:"Mike",Height:"6'4"}); 
arr.push ({Name:"Jackie",Height:"5'9"}); 
arr.push ({Name:"Mike",Height:"0'10"}); 

dg.addColumn("Name"); 
dg.addColumn("Height"); 
dg.dataProvider = new DataProvider(arr); 
dg.addEventListener(ListEvent.ITEM_CLICK,updatename); 


function updatename(e):void { 
    arr[e.rowIndex]["Name"] = "none"; 
} 

但是,您仍然無法使用arr.splice刪除數組中的一行,並讓它自動更新數據網格。對於刪除(splice)和添加(push),你必須更新數組和數據網格。

0

可以更改數據,然後ASIGN dataProvider中再次

var myDataProvider = new DataProvider(this.myArray); 
this['list'].dataProvider = myDataProvider; 

myDataProvider.getItemAt(0)["Name"] = "Some change"; 
this['list'].dataProvider = myDataProvider; 
相關問題