我有一个Flex树控件,我试图在dataProvider分配了如下所示的集合对象后立即选择一个3级的树节点。
基本上treeItem1,treeItem2,treeItem3是树中的节点,treeitem3是treeItem2的子节点,treeItem2是treeItem1的子节点。假设从集合项中正确引用了这些treeItem(1,2,3)。
我的问题是,如果我等待整个组件完全加载然后选择节点,它会正确打开/ select / scrolltoIndex。但是,如果我在分配dataProvider之后立即选择节点,那么它甚至不会打开或选择(基本上 this.treeService.selectedItem 总是为null)。
谁能指出我做错了什么?在分配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);
答案 0 :(得分:2)
我已经使用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);
}
答案 1 :(得分:0)
我不是肯定你遇到同样的问题,但我似乎与使用高级数据网格有相同类型的问题,在这些情况下,数据提供者可以接受为多种类型,组件做了一些额外的工作在后台将事物包装成Hierarchical(HierarchicalData或HierarchicalCollectionView)并且在这样做时,dataprovider setter调用不是同步的(因此它将在实际分配存储dataprovider的内部属性之前返回)。我在这种情况下使用了callLater并取得了一定的成功,callLater通常是一种不好的做法,但是基本上将一个函数添加到一个函数列表中,一旦后台处理完成就调用,所以这假设dataprovider setter中的某些东西叫做UIComponent.suspendBackgroundProcessing ()然后它将调用UIComponent.resumeBackgroundProcessing()然后它将执行使用callLater添加的函数列表。或者,您可以使用setTimeout(someFunction,1000)。
这些都是“黑客”真正的解决方案是深入挖掘框架代码,并在告诉它设置数据提供者时看看它真正在做什么。无论你在哪里看到它实际上已经设置了数据提供者,你都可以扩展该类并调度一个你可以监听的事件来运行该函数以在此之后进行选择。
如果有人有更好的解决方案,请务必纠正我(我希望得到比这更好的答案)