如何告知DataProvider更新?

时间:2009-08-15 01:35:07

标签: flash actionscript-3 dataprovider

我正在使用数组填充DataProvider,我用它来填充列表组件。像这样:

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

当对数组进行更改时,我想告诉DataProvider更新,以便这些更改将反映在列表组件中。如果有一种方法可以告诉DataProvider监听数组中的更改并自行更新,那将是很好的,但我会想办法手动更新它。

我可以用新的DataProvider替换DataProvider,但是列表会丢失它的选择。我想我可以浏览DataProvider并比较和修改每个条目以使其与数组匹配,但这似乎太麻烦了。有没有办法告诉DataProvider更新以匹配数组?

编辑:我正在寻找一种在Flash中执行此操作的方法,而不是Flex。

4 个答案:

答案 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类提供了一系列数据操作方法,例如addItemremoveItemreplaceItemreplaceItemAt,例如。< / 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;