Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 将子项添加到HierarchycalCollectionView_Actionscript 3_Apache Flex_Hierarchical Data - Fatal编程技术网

Actionscript 3 将子项添加到HierarchycalCollectionView

Actionscript 3 将子项添加到HierarchycalCollectionView,actionscript-3,apache-flex,hierarchical-data,Actionscript 3,Apache Flex,Hierarchical Data,我试图在ADG上实现延迟加载。我陷入了需要将返回的子节点添加到扩展节点的境地 目前我正在做: private function childrenloaded(data:*,item:*):void { var len:int = data.length; for(var i=0;i<len;i++) (internalMainGrid.dataProvider as HierarchicalCollectionView).addChild(item, dat

我试图在ADG上实现延迟加载。我陷入了需要将返回的子节点添加到扩展节点的境地

目前我正在做:

private function childrenloaded(data:*,item:*):void
{
    var len:int = data.length;
    for(var i=0;i<len;i++)
        (internalMainGrid.dataProvider as HierarchicalCollectionView).addChild(item, data[i]);
}
但这并不是在刷新视图


欢迎为更好的解决方案提供任何帮助或指导。提前谢谢

您应该从
internalMainGrid.dataProvider
调度
collection\u change
事件,以触发视图中的更改或调用
refresh()
方法(它属于
ICollectionView
,由
HierarchycalCollectionView
作为
IHierarchicalCollectionView
的实现者实现)在同一个数据提供程序上。

您应该从
internalMainGrid.dataProvider
中调度
集合更改
事件,以触发视图中的更改或调用
刷新()
方法(它属于
ICollectionView
,由
HierarchycalCollectionView
作为
IHierarchicalCollectionView
的实现者在同一个数据提供程序上实现。

我做了同样的事情。根据我的发现-使用GroupingCollection(2)和/或SummaryRow确实会减慢速度。更不用说在特定节点获取新数据时,整个树的打开-关闭都会重置

从烟雾测试性能来看,拉动/喷涂约2000行大约需要5秒。 现在,每个节点上的100-200行大约需要1/2秒或更少的时间(不包括首次向屏幕调用ADG时的初始绘制延迟)

就我而言,我已经做到了以下几点:

  • 扩展
    HierarchycalData
    ,根据我每次从数据库获取的摘要数据自定义子节点何时存在,并指定哪个属性包含要显示的子节点(如果不同于子属性)-我这样做是因为我在RobotLegs MVC平台中使用了模型
  • 扩展
    AdvancedDataGridGroupItemRenderer
    以直观地更改公开图标(三角形图形)的颜色,让用户知道与已有数据的节点相比,需要获取哪些元素。将其分配给groupItemRenderer属性
  • 使用
    AdvancedDataGridEvent.ITEM\u OPEN
    listener分派包含event.ITEM属性的事件,以便命令>服务>响应程序在UI请求的确切节点(添加到子属性)更新模型
  • 将适当的
    CollectionChangeEvent
    添加到顶级集合(它的子集合是ArrayCollections-嵌套集合不绑定)
  • 在响应程序声明完成后调用dataprovider刷新方法
  • 下面的示例:

    //Listener on Grid:
    protected function onLedgerOpenSummaryNode(event:AdvancedDataGridEvent):void 
    {
        trace('LedgerMediator.onLedgerOpenSummaryNode', event.item);
    
        if (event.item is SummaryTransaction)
        {
            refreshed = false;
            sumTrans = event.item as SummaryTransaction;
            //note - in my service responder I add the resulting db rows to the event.item
            dispatch(new AccountEvent(AccountEvent.SUMMARY_DETAIL, null, account, event.item as SummaryTransaction));
        }
    }
    
    //Dataprovider assignment to grid
    private function get dataProvider():HierarchicalCollectionView
    {
        if (!groupCollection)
        {
            groupCollection = new HierarchicalCollectionView();
            groupCollection.source = new OnDemandCollection();
        }
    
        return groupCollection;
    }
    
    //assigns the initial source to the demand collection
    private function loadTransactions():void
    {
        var odc:OnDemandCollection = OnDemandCollection(dataProvider.source);
            odc.source = account.summaryTransactions.children;
    
        transactionChangeDetection(true);
        view.callLater(deferrDataProviderUpdate);
    }
    
    //called when the service.responder dispatches it's 'complete event'.
    private function deferrDataProviderUpdate():void 
    {
        if (refreshed) return;
        dataProvider.refresh(); 
    }
    
    //add change event listener to the top-level collection
    private function transactionChangeDetection(add:Boolean):void
    {
        var collection:ArrayCollection;
        //nested collections are not binding up the object chain, so change listeners must be added/removed to/from each collection.
        for each ( var summary:SummaryTransaction in account.summaryTransactions.collection)
        {
            collection = summary.transactions.collection;
            add ? collection.addEventListener(CollectionEvent.COLLECTION_CHANGE, onTransactionUpdate)
                : collection.removeEventListener(CollectionEvent.COLLECTION_CHANGE, onTransactionUpdate);
        }
    }
    
    //block the refresh method - only interested in add,delete,update
    protected function onTransactionUpdate(event:CollectionEvent):void 
    {
        if (event.kind == CollectionEventKind.REFRESH) return;
        view.callLater(deferrDataProviderUpdate);
    }
    
    
    public class ExtAdvancedDataGridGroupItemRenderer extends AdvancedDataGridGroupItemRenderer 
    {
        private var defaultColor:ColorTransform;
    
        public function ExtAdvancedDataGridGroupItemRenderer() 
        {
            super();
        }
    
        override protected function commitProperties():void 
        {
            super.commitProperties();
            if (disclosureIcon) defaultColor = disclosureIcon.transform.colorTransform;
        }
    
        override protected function updateDisplayList(w:Number, h:Number):void 
        {
            super.updateDisplayList(w, h);
    
            if (!listData || !data) return;
    
            var adgld:AdvancedDataGridListData = AdvancedDataGridListData(listData);
            var adg:AdvancedDataGrid = adgld.owner as AdvancedDataGrid;
            var hcv:HierarchicalCollectionView = adg.dataProvider as HierarchicalCollectionView;
            var source:IHierarchicalData = hcv.source;
    
            var useDefaultColor:Boolean;
            var visible:Boolean;
            if (!data) visible = false;
            else if (!source.canHaveChildren(data)) visible = false;
            else if (source.hasChildren(data)) 
            {
                useDefaultColor = true;
                visible = true;
            }
            else
            {
                visible = true;
    
                var ct:ColorTransform = new ColorTransform();
                    ct.color = 0xBCB383;
                disclosureIcon.transform.colorTransform = ct;
            }
    
            if (useDefaultColor) disclosureIcon.transform.colorTransform = defaultColor;
            disclosureIcon.visible = visible;
        }
    }
    
    public class OnDemandCollection extends HierarchicalData
    {
    
        public function OnDemandCollection() 
        {
            super();
        }
    
    
        override public function getChildren(node:Object):Object 
        {
            if (node is SummaryGrouping) return SummaryGrouping(node).children;
            else if (node is SummaryTransaction) return SummaryTransaction(node).children;
            else if (node is Transaction) return Transaction(node).children;
    
            return {};
        }
    
        override public function canHaveChildren(node:Object):Boolean 
        {
            if (node is SummaryGrouping)
            {
                return true;
            }
            else if (node is SummaryTransaction)
            {
                var sumTran:SummaryTransaction = SummaryTransaction(node);
                return sumTran.numTransactions > 0;
            }
            else if (node is Transaction)
            {
                var tran:Transaction = Transaction(node);
                return tran.isSplit;
            }
            else if (node is Split) return false;
            else if (node.hasOwnProperty('children'))
            {
                var list:IList = node['children'] as IList;
                return list.length > 0;
            }
            else return false;
        }
    }
    

    我也做了同样的事情。从我发现的情况来看,使用GroupingCollection(2)和/或SummaryRow确实会减慢速度。更不用说在特定节点获取新数据时,整个树的打开-关闭都会重置

    从烟雾测试性能来看,拉动/喷涂约2000行大约需要5秒。 现在,每个节点上的100-200行大约需要1/2秒或更少的时间(不包括首次向屏幕调用ADG时的初始绘制延迟)

    就我而言,我已经做到了以下几点:

  • 扩展
    HierarchycalData
    ,根据我每次从数据库获取的摘要数据自定义子节点何时存在,并指定哪个属性包含要显示的子节点(如果不同于子属性)-我这样做是因为我在RobotLegs MVC平台中使用了模型
  • 扩展
    AdvancedDataGridGroupItemRenderer
    以直观地更改公开图标(三角形图形)的颜色,让用户知道与已有数据的节点相比,需要获取哪些元素。将其分配给groupItemRenderer属性
  • 使用
    AdvancedDataGridEvent.ITEM\u OPEN
    listener分派包含event.ITEM属性的事件,以便命令>服务>响应程序在UI请求的确切节点(添加到子属性)更新模型
  • 将适当的
    CollectionChangeEvent
    添加到顶级集合(它的子集合是ArrayCollections-嵌套集合不绑定)
  • 在响应程序声明完成后调用dataprovider刷新方法
  • 下面的示例:

    //Listener on Grid:
    protected function onLedgerOpenSummaryNode(event:AdvancedDataGridEvent):void 
    {
        trace('LedgerMediator.onLedgerOpenSummaryNode', event.item);
    
        if (event.item is SummaryTransaction)
        {
            refreshed = false;
            sumTrans = event.item as SummaryTransaction;
            //note - in my service responder I add the resulting db rows to the event.item
            dispatch(new AccountEvent(AccountEvent.SUMMARY_DETAIL, null, account, event.item as SummaryTransaction));
        }
    }
    
    //Dataprovider assignment to grid
    private function get dataProvider():HierarchicalCollectionView
    {
        if (!groupCollection)
        {
            groupCollection = new HierarchicalCollectionView();
            groupCollection.source = new OnDemandCollection();
        }
    
        return groupCollection;
    }
    
    //assigns the initial source to the demand collection
    private function loadTransactions():void
    {
        var odc:OnDemandCollection = OnDemandCollection(dataProvider.source);
            odc.source = account.summaryTransactions.children;
    
        transactionChangeDetection(true);
        view.callLater(deferrDataProviderUpdate);
    }
    
    //called when the service.responder dispatches it's 'complete event'.
    private function deferrDataProviderUpdate():void 
    {
        if (refreshed) return;
        dataProvider.refresh(); 
    }
    
    //add change event listener to the top-level collection
    private function transactionChangeDetection(add:Boolean):void
    {
        var collection:ArrayCollection;
        //nested collections are not binding up the object chain, so change listeners must be added/removed to/from each collection.
        for each ( var summary:SummaryTransaction in account.summaryTransactions.collection)
        {
            collection = summary.transactions.collection;
            add ? collection.addEventListener(CollectionEvent.COLLECTION_CHANGE, onTransactionUpdate)
                : collection.removeEventListener(CollectionEvent.COLLECTION_CHANGE, onTransactionUpdate);
        }
    }
    
    //block the refresh method - only interested in add,delete,update
    protected function onTransactionUpdate(event:CollectionEvent):void 
    {
        if (event.kind == CollectionEventKind.REFRESH) return;
        view.callLater(deferrDataProviderUpdate);
    }
    
    
    public class ExtAdvancedDataGridGroupItemRenderer extends AdvancedDataGridGroupItemRenderer 
    {
        private var defaultColor:ColorTransform;
    
        public function ExtAdvancedDataGridGroupItemRenderer() 
        {
            super();
        }
    
        override protected function commitProperties():void 
        {
            super.commitProperties();
            if (disclosureIcon) defaultColor = disclosureIcon.transform.colorTransform;
        }
    
        override protected function updateDisplayList(w:Number, h:Number):void 
        {
            super.updateDisplayList(w, h);
    
            if (!listData || !data) return;
    
            var adgld:AdvancedDataGridListData = AdvancedDataGridListData(listData);
            var adg:AdvancedDataGrid = adgld.owner as AdvancedDataGrid;
            var hcv:HierarchicalCollectionView = adg.dataProvider as HierarchicalCollectionView;
            var source:IHierarchicalData = hcv.source;
    
            var useDefaultColor:Boolean;
            var visible:Boolean;
            if (!data) visible = false;
            else if (!source.canHaveChildren(data)) visible = false;
            else if (source.hasChildren(data)) 
            {
                useDefaultColor = true;
                visible = true;
            }
            else
            {
                visible = true;
    
                var ct:ColorTransform = new ColorTransform();
                    ct.color = 0xBCB383;
                disclosureIcon.transform.colorTransform = ct;
            }
    
            if (useDefaultColor) disclosureIcon.transform.colorTransform = defaultColor;
            disclosureIcon.visible = visible;
        }
    }
    
    public class OnDemandCollection extends HierarchicalData
    {
    
        public function OnDemandCollection() 
        {
            super();
        }
    
    
        override public function getChildren(node:Object):Object 
        {
            if (node is SummaryGrouping) return SummaryGrouping(node).children;
            else if (node is SummaryTransaction) return SummaryTransaction(node).children;
            else if (node is Transaction) return Transaction(node).children;
    
            return {};
        }
    
        override public function canHaveChildren(node:Object):Boolean 
        {
            if (node is SummaryGrouping)
            {
                return true;
            }
            else if (node is SummaryTransaction)
            {
                var sumTran:SummaryTransaction = SummaryTransaction(node);
                return sumTran.numTransactions > 0;
            }
            else if (node is Transaction)
            {
                var tran:Transaction = Transaction(node);
                return tran.isSplit;
            }
            else if (node is Split) return false;
            else if (node.hasOwnProperty('children'))
            {
                var list:IList = node['children'] as IList;
                return list.length > 0;
            }
            else return false;
        }
    }