首页 > 设计 > WEB开发 > 正文

6.12.为GroupingCollection创建异步刷新

2023-08-02 23:09:36
字体:
来源:转载
供稿:网友
6.12.1. 问题
我想异步刷新大数据量的GroupingCollection 表格,只在调用时重绘。
6.12.2. 解决办法
使用GroupingCollection.refresh(async:Boolean),设置异步标志为true。
6.12.3. 讨论
GroupingCollection.refresh 方法接受一个标志指示分组是否需要异步或同步执行。当数据行数量非常巨大时,设置标志为true 可在显示之前刷新分组结果。这通常用来解决避免当GroupingCollection.refresh 调用需花费很长时间而导致Flash Player 响应超时问题。

分组的异步生成在用户需要与分组项交互时非常有用。GroupingCollection.cancelRefresh 可以停止正在进行的分组,并根据用户的输入开始新的分组。

下面的例子中,点击populateADGButton 按钮生成随机数据显示在AdvancedDataGrid。你可以修改数字分档器生成随机数据行数量,点击Group 按钮开始异步刷新。AdvancedDataGrid会立即显示分组结果。你可以在任何时候点击Cancel Grouping 按钮取消分组。
+展开
-XML
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="verticalwidth="520height="440">

<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.collections.IGroupingCollection;
import mx.collections.GroupingField;
import mx.collections.Grouping;
import mx.collections.GroupingCollection;
[Bindable]
private var generatedData:Array = [];
private var companyNames:Array = ["Adobe""BEA""Cosmos",
"Dogma""Enigma","Fury""Gama""Hima""Indian""Jaadu",
"Karish""Linovo""Micro""Novice","Oyster""Puple""Quag",
"Rendi""Scrup""Tempt""Ubiqut""Verna""Wision","Xeno",
"Yoga""Zeal" ];
private var products:Array = [ "Infuse""MaxVis""Fusion",
"Horizon""Apex""Zeeta""Maza""Orion""Omega""Zoota",
"Quata""Morion" ];
private var countries:Array = [ "India""USA""Canada",
"China""Japan""France""Germany""UK""Brazil""Italy",
"Chile""Bhutan""Sri Lanka" ];
private var years:Array = ["2000""2001""2002""2003",
"2004""2005""2006""2007""2008""2009""2010""2011",
"2012""2013""2014""2015""2016","2017""2018""2019",
"2020""2021""2022""2023""2024"];
private var quarters:Array = ["Q1""Q2""Q3""Q4"];
private var months:Array = ["Jan""Feb""Mar""Apr",
"May""Jun""Jul""Aug""Sep""Oct""Nov""Dec" ];
private var sales:Array = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ;
private var costs:Array = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ;
private var dimNameMatch:Object = { Company:companyNames,
Product:products, Country:countries, Year:years, Quarter:quarters,
Month:months,Sales:sales,Cost:costs};
private function generateData():void
{
generatedData = [];
var length:int = numRows.value;
var dimNameMap:Object = dimNameMatch;
for (var index:int = 0; index < length; ++index)
{
var newObj:Object = {};
for (var prop:String in dimNameMap)
{
var input:Array = dimNameMap[prop];
var inputIndex:int = Math.random()*input.length;
newObj[prop] = input[inputIndex];
}
generatedData.push(newObj);
}
}
private function populateADG():void
{
if (generatedData.length != numRows.value)
generateData();
adg.dataProvider = generatedData;
}
[Bindable]
private var gc:GroupingCollection;
private function groupData():void
{
var fields:Array = [];
if (company.selected)
fields.push(new GroupingField("Company"));
if (product.selected)
fields.push(new GroupingField("Product"));
if (year.selected)
fields.push(new GroupingField("Year"));
if (fields.length == 0)
{
Alert.show("Select at least one of the items to
group on");
return;
}
gc = new GroupingCollection();
gc.source = generatedData;
gc.grouping = new Grouping();
gc.grouping.fields = fields;
//use async refresh so that we get to see the results early.
gc.refresh(true);
adg.dataProvider = gc;
}
private function handleOptionChange():void
{
//user has not started grouping yet
if (!gc) return;
//stop any refresh that might be going on
gc.cancelRefresh();
var fields:Array = [];
if (company.selected)
fields.push(new GroupingField("Company"));
if (product.selected)
fields.push(new GroupingField("Product"));
if (year.selected)
fields.push(new GroupingField("Year"));
//user might have checked off everything
if (fields.length == 0)
{
return;
}
gc.grouping.fields = fields;
gc.refresh(true);
}

]]>
</mx:Script>
<mx:AdvancedDataGrid id="adgwidth="100%height="260" >
<mx:columns>
<mx:AdvancedDataGridColumn dataField="Company" />
<mx:AdvancedDataGridColumn dataField="Product" />
<mx:AdvancedDataGridColumn dataField="Year" />
<mx:AdvancedDataGridColumn dataField="Sales" />
</mx:columns>
</mx:AdvancedDataGrid>
<mx:HBox>
<mx:NumericStepper id="numRowsstepSize="1000minimum="1000"
maximum="10000" />

<mx:Button label="Populate ADGclick="populateADG()"
id="populateADGButton"/>

</mx:HBox>
<mx:VBox>
<mx:HBox>
<mx:Label text="Grouping fields:" />
<mx:CheckBox id="companylabel="Companyselected="true"
click="handleOptionChange()"/>

<mx:CheckBox id="productlabel="Product"
click="handleOptionChange()"/>

<mx:CheckBox id="yearlabel="Year"
click="handleOptionChange()"/>

</mx:HBox>
<mx:HBox>
<mx:Button label="Groupclick="groupData()" />
<mx:Button label="Cancel groupingclick="gc.cancelRefresh()"
enabled="{gc != null}"/>

</mx:HBox>
</mx:VBox>
</mx:Application>

三个复选框允许执行不同的分组组合。当刷新在进行时用户可以直接改变分组选择,GroupCollection 的cancelRefresh 方法用于停止AdvancedDataGrid 创建和显示新的分组。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表