【问题标题】:Flex: select tree node right after the dataProvider is been assigned / updated / replaceFlex:在 dataProvider 被分配/更新/替换后立即选择树节点
【发布时间】:2011-01-26 23:36:04
【问题描述】:

我有一个 Flex 树控件,并且在为 dataProvider 分配了一个如下所示的集合对象后,我试图选择一个向下 3 层的树节点。

基本上treeItem1、treeItem2、treeItem3 是树中的节点,而treeitem3 是treeItem2 的子节点,treeItem2 是treeItem1 的子节点。假设这些 treeItem(1,2,3) 是从集合项中正确引用的。

我的问题是,如果我等待整个组件完全加载然后选择节点,它会正确打开/选择/scrolltoIndex。但是,如果我在分配 dataProvider 后立即选择节点,那么它甚至不会打开或选择(基本上 this.treeService.selectedItem 始终为空)。

谁能指出我做错了什么?分配dataProvider后有什么需要做的吗?

谢谢

this.treeService.dataProvider = oPricingHelper.getCurrentPricingSercicesTreeSource();
this.treeService.expandItem(treeItem1, true);
this.treeService.expandItem(treeItem2, true);
this.treeService.selectedItem = treeItem3;
this.treeService.scrollToIndex(this.treeService.selectedIndex);

【问题讨论】:

    标签: apache-flex tree


    【解决方案1】:

    我使用 updateComplete 事件来了解组件(例如 DataGroup 或 List)在执行简单任务(例如更新 dataProvider 引用)后何时完成渲染。当然,您必须小心并删除对 updateComplete 的侦听,因为它可以运行很多,除非您需要它运行。

    类似:

    //...some function...
        this.treeService.addEventListener(FlexEvent.UPDATE_COMPLETE, onTreeUpdateComplete);
        this.treeService.dataProvider = oPricingHelper.getCurrentPricingSercicesTreeSource();
    //...rest of some function...
    
    private function onTreeUpdateComplete(event:FlexEvent):void {
        this.treeService.removeEventListener(FlexEvent.UPDATE_COMPLETE, onTreeUpdateComplete);
        this.treeService.expandItem(treeItem1, true);
        this.treeService.expandItem(treeItem2, true);
        this.treeService.selectedItem = treeItem3;
        this.treeService.scrollToIndex(this.treeService.selectedIndex);
    }
    

    【讨论】:

      【解决方案2】:

      我不确定您是否遇到过同样的问题,但我似乎在使用高级数据网格时遇到了相同类型的问题,在这些情况下,数据提供者可以作为多种类型出现,组件会做一些额外的工作在后台将事物包装成分层结构(HierarchicalData 或 HierarchicalCollectionView),这样做时 dataprovider setter 调用不是同步的(因此它会在实际分配存储 dataprovider 的内部属性之前返回)。在这种情况下,我使用 callLater 并取得了一定的成功, callLater 通常是一种不好的做法,但基本上是在后台处理完成后将一个函数添加到要调用的函数列表中,因此这是假设 dataprovider 设置器中的某些东西称为 UIComponent.suspendBackgroundProcessing () 并且它将随后调用 UIComponent.resumeBackgroundProcessing() 然后它将执行使用 callLater 添加的函数列表。或者,您可以使用 setTimeout(someFunction,1000)。

      这些都是“黑客”,真正的解决方案是深入研究框架代码,看看当你告诉它设置数据提供者时它到底在做什么。无论您在哪里看到它实际上已经设置了 dataprovider,您都可以扩展该类并调度一个您可以监听的事件,以运行该函数以在此点之后进行选择。

      如果有人有更好的解决方案,请务必纠正我(我希望有比这更好的答案)

      【讨论】:

        猜你喜欢
        • 2013-04-24
        • 1970-01-01
        • 2013-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-12
        • 2020-11-05
        • 2011-06-02
        相关资源
        最近更新 更多