我正在使用数组填充DataProvider,我用它来填充列表组件。像这样:
var myDataProvider = new DataProvider(this.myArray);
this['list'].dataProvider = myDataProvider;
当对数组进行更改时,我想告诉DataProvider更新,以便这些更改将反映在列表组件中。如果有一种方法可以告诉DataProvider监听数组中的更改并自行更新,那将是很好的,但我会想办法手动更新它。
我可以用新的DataProvider替换DataProvider,但是列表会丢失它的选择。我想我可以浏览DataProvider并比较和修改每个条目以使其与数组匹配,但这似乎太麻烦了。有没有办法告诉DataProvider更新以匹配数组?
编辑:我正在寻找一种在Flash中执行此操作的方法,而不是Flex。
答案 0 :(得分: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
类提供了一系列数据操作方法,例如addItem
,removeItem
,replaceItem
,replaceItemAt
,例如。< / p>
因此,它基本上归结为您需要对源数组进行哪些更改。通常情况下,您可以通过DataProvider
来完成这些工作。
答案 1 :(得分:1)
我花了最后4个小时试图找出数据提供者与原始数组之间的联系。我发现当我使用GetItemAt方法时,在datagrid上使用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方法,它从数据网格中删除了行,但是没有更新数组。在这个项目的开始,我不知道getItemAt会更新数组,所以我花了4个小时试图找出我的代码减去两次的原因。
答案 2 :(得分: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删除数组中的行,并让它自动更新数据网格。对于删除(拼接)和添加(推送),您必须更新数组和数据网格。
答案 3 :(得分:0)
您可以更改数据,然后重新设置数据提供者
var myDataProvider = new DataProvider(this.myArray);
this['list'].dataProvider = myDataProvider;
myDataProvider.getItemAt(0)["Name"] = "Some change";
this['list'].dataProvider = myDataProvider;