4

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

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

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

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

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

4

4 回答 4

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 本身进行更改,那么您就可以开始了。

AS3DataProvider类提供了一系列数据操作方法,例如addItem, removeItem, replaceItem, replaceItemAt

因此,它基本上归结为您需要对源数组进行什么样的更改。通常,您可以通过DataProvider.

于 2009-08-15T01:44:10.457 回答
1

我花了过去 4 个小时试图弄清楚数据提供者和原始数组之间的连接是什么。我发现在数据网格上使用 GetItemAt 方法也会更新数据网格的数据提供者在使用 GetItemAt 方法时自动更新的数组。

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 个小时试图弄清楚我的代码是如何减去两次的。

于 2011-08-01T04:05:21.790 回答
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 删除数组中的一行并让它自动更新数据网格。对于删除(拼接)和添加(推送),您必须分别更新数组和数据网格。

于 2011-08-01T04:10:36.053 回答
0

您可以更改数据,然后再次分配数据提供者

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

myDataProvider.getItemAt(0)["Name"] = "Some change";
this['list'].dataProvider = myDataProvider;
于 2014-01-21T18:30:30.503 回答