DataSet 组件是专用于管理项目集合(传输对象)的引擎,其中每个项目代表外部数据源中的一条数据记录。可以使用筛选、排序、排列和随机访问对集合内的项目进行迭代。将 DataSet 组件和连接器及解析程序组件结合使用提供了用于对 Flash 应用程序和外部数据源之间的数据进行访问、管理和更新的完整解决方法。
DataSet 组件仅在 Flash Player 7 中起作用。
可以为 DataSet 组件设置以下参数:
itemClassName 字符串,代表每次在 DataSet 组件内创建新项目时实例化的传输对象类的名称。必须在代码内的某个位置对这个类进行全限定引用,以确保将它编译到应用程序中(如 private var myItem:my.package.myItem;
)。
DataSet 组件使用传输对象来表示从外部数据源中检索的数据。如果将此参数留空,数据集将为您创建一个匿名传输对象。如果为此参数指定值,数据集将在每次添加新数据时对传输对象进行实例化。
filtered 布尔值,默认为 false
。如果将此参数设置为 true
,则会对 DataSet 组件应用筛选,以使该组件仅包含匹配筛选条件的对象。
logChanges 布尔值,默认为 true
。如果将此参数设置为 true
,数据集将记录对数据进行的所有更改或方法调用。
readOnly 布尔值,默认为 false
。如果将此参数设置为 true
,则无法修改数据集。
DataSet 组件的典型工作流程如下所示。
在 DataSet 组件内选定一条新记录(传输对象)时,UI 控件将收到通知,并随之更新。此外,在修改 UI 控件内的数据时,Dataset 组件将收到通知,并使用 DeltaPacket 跟踪更改。
注意:除了上述步骤之外,您还可以将 DataSet 组件绑定到连接器和解析程序组件,以便提供用于对外部数据源中的数据进行访问、管理和更新的完整解决方法。
有关 DataSet 组件的详细信息,请参阅DataSet 组件。
请务必记住,DataSet 组件是传输对象的集合。它与之前的组件实现不同,因为之前它只是数据的简单内存中缓存(记录对象的数组)。传输对象通过 public 属性或 accessor 方法公开外部数据源中的业务数据。DataSet 组件使企业开发人员能够处理映射其服务器端副本的复杂客户端对象,或客户端对象最简单的形式,即代表数据记录内的字段的匿名对象(带有 public 属性)的集合。
可以使用两种数据结构将数据载入 DataSet 组件:
可以将对象数组绑定或指定到代码中的 DataSet.items
属性。可以将实现 DataProvider 接口的类绑定或指定到代码中的 DataSet.dataProvider
属性。
以下示例将对象载入 DataSet 组件:
匿名对象 本示例将 100 个匿名对象指定到 DataSet 组件。每个对象代表一条数据记录。
function loadData() { var recData = new Array(); for( var i:Number=0; i<100; i++ ) { recData[i]= {id:i, name:String("name"+i), price:i*.5}; } myDataSet.items = recData; }
Remoting RecordSet 本示例假定您已进行了返回 RecordSet 的远程调用。RecordSet 对象实现 DataProvider 接口。
function getSQLData_Result(result) { myDataset.dataProvider = result; }
从 Web 服务中返回的对象数组 使用数据绑定,您可以将从 Web 服务中返回的对象数组指定到 DataSet 组件的items
属性。
从 XMLConnector 组件中返回的对象数组 本示例假定您已读入包含对象数组的 XML 文件的架构。在此方案下,从 XMLConnector 组件中返回的实际数据是 XML 节点的数组,DataSet 组件不支持该数组。然而,数据绑定(用于将数据从 XMLConnector 组件复制到 DataSet 组件的传输机制)可以实现 DataProvider 接口。因此,您可以将 XML 节点的数组指定到 DataSet.dataProvider
属性,数据绑定功能将完成其余的工作。
当您将数据载入 DataSet 组件时,数据即会转换为传输对象的集合。在最简单的方案下,DataSet 组件会创建并将数据载入匿名对象。每个匿名对象都可实现 TransferObject 接口,DataSet 组件只需该接口即可管理对象。DataSet 组件会跟踪对数据进行的更改和对对象进行的任何方法调用。如果在匿名对象上调用方法,则不会产生任何效果,因为方法并不存在。然而,DataSet 组件会在 DeltaPacket 中跟踪这些方法调用,从而保证将它们发送到外部数据源(适用时可在其中进行方法调用)。
在企业解决方案中,可以创建映射服务器端传输对象的客户端动作脚本传输对象。此客户机对象可以实现用于处理数据或应用客户端约束的附加方法。开发人员可以使用 DataSet 组件的 itemClassName
参数标识应创建的客户端传输对象的类名。在此方案下,DataSet 组件会生成指定类的多个实例,并使用加载的数据对其进行初始化。在 DataSet 组件上调用 addItem()
时,将使用 itemClassName
来创建客户端传输对象的空实例。
如果进一步采用企业解决方案,则可以实现使用 Web 服务或 Flash Remoting 的客户端传输对象。在此方案下,对象将在服务器上直接进行调用,并可能对 DeltaPacket 中的调用进行排序。
注意:通过创建实现 TransferObject 接口的类,您可以创建自己的自定义传输对象以供 DataSet 组件使用。有关 TransferObject 接口的详细信息,请参阅组件字典。
一旦将数据载入 DataSet 组件,就需要对其进行访问。在运行时访问数据十分简单。传输对象通过可在代码中引用的属性公开数据。DataSet 组件包含了游标(指向当前选定的传输对象)的概念。以下代码使用客户信息加载 DataSet 组件,然后在跟踪窗口中显示每个客户的名称:
var recData = [{id:0, firstName:"Frank", lastName:"Jones", age:27, usCitizen:true}, {id:1, firstName:"Susan", lastName:"Meth", age:55, usCitizen:true}, {id:2, firstName:"Pablo", lastName:"Picasso", age:108, usCitizen:false}]; myDataSet.items = recData; myDataSet.first(); while ( myDataSet.hasNext() ) { //通过 Dataset 属性访问数据 trace(myDataSet.firstName + " " + myDataSet.lastName); myDataSet.next(); }
要在设计时设置对此数据的绑定,您可以为 DataSet 组件创建表示传输对象的属性的永久性字段,如以下示例中所示。
var recData = [{id:0, firstName:"Frank", lastName:"Jones", age:27, usCitizen:true}, {id:1, firstName:"Susan", lastName:"Meth", age:55, usCitizen:true}, {id:2, firstName:"Pablo", lastName:"Picasso", age:108, usCitizen:false}]; myDataSet.items = recData;
dataProvider
属性。数据网格中即会显示数据集内传输对象中包含的数据。
在设计时为 DataSet 组件创建字段是向数据绑定公开传输对象属性的最便捷方式。一旦定义了字段,您就可以在设计时直观地将 UI 控件绑定到数据。同时,在设计时还可以为 DataSet 字段设置许多附加属性(架构项目设置),这些属性影响在运行时对数据进行编码、格式化和验证的方式。请参阅在“架构”选项卡中处理架构(仅限于 Flash Professional)。
在设计时使用添加到“架构”选项卡的动态组件属性的功能是 DataSet 组件的一项特殊功能。DataSet 组件使用这些属性的字段名称,以便将它们映射为传输对象的属性。设置将在设计时应用到这些属性,并随后由数据集在运行时使用。
如果没有为 DataSet 组件创建永久性字段,并且您将该组件绑定到 WebServiceConnector 组件或定义架构的 XMLConnector 组件,则 DataSet 组件将尝试根据连接器组件的架构创建正确的字段。
注意:为 DataSet 组件定义的永久性字段优先于连接器组件的架构。