我将如何去保持树控件的状态? 我想在数据提供者得到更新时保持树状态,而不是崩溃。Flex:树组件:当数据提供者更新时保持状态
回答
我不认为有一种方法可以自动执行此操作(虽然我从来不必使用树控件)。我认为你最好的选择是扩展树形控件并处理你自己的状态记录。
例如,我可能会重写data属性,以便您可以在组件上设置新的数据对象之前运行状态检查功能。纵观帮助有方法
isItemOpen(item:Object):Boolean,
和
expandItem(item:Object, open:Boolean, animate:Boolean = false, dispatchEvent:Boolean = false, cause:Event = null):void
你需要通过递归的每个节点上运行,并检查它的开放和存储该节点的状态。然后,当它重新绘制新的数据提供程序时,递归地运行新节点并检查它们之前是否有任何之前打开过,如果是,则展开它们。
怎么是这样的:
var openItems:Object = tree.openItems; tree.dataProvider = myNewDataProvider; tree.openItems = openItems; tree.validateNow();
我不知道有多好,如果新的数据提供程序是从旧的完全不同,这将工作,但它的工作原理,当你延迟加载树节点。
+1听起来像是一个很好的电话给我 – 2009-02-15 19:34:04
这实际上很容易做到。您只需确保Component绑定到其dataProvider,而不是仅引用它。所以,在mxml中,这是用于分配dataProvider的大括号语法。另外,DP必须是[Bindable]。
如果你这样做,任何时候你更新(添加节点,删除,重命名,无论)你的数据提供者,它会自动更新你的控制。不需要手动无效或更新。
如果您需要实际的代码示例,请告诉我。
您需要在代表节点的数据对象上实现IUID接口。 UID是一个唯一的标识符,通常只是建立在对象中的数据之外,但有时候更准确地覆盖这个标识符并使其在数据提供者刷新之间持续存在一些GUID。因此,如果UID匹配,则在使用新的数据提供者时,上述内容将起作用。
希望有道理。
Inferis的回答涉及存储openItems,然后在数据提供者更新后再次设置它们,并结合在dataprovider数组集合中的对象上实现IUID接口。
上IUID更多信息:http://livedocs.adobe.com/flex/3/html/help.html?content=about_dataproviders_8.html
对于BlazeDS的,我与更新,并不会破坏用户体验重装Tree组件数据的工作项目(当重新载入数据的所有节点关闭)。 而不是保持“先前打开哪个节点?”和“什么是滚动位置?”选项卡我找到了一种方法将树状组件数据的新状态注入到现有的数据提供程序中。
这是我如何得到它的工作。关键是调用
*yourTreeInstance*.validateDisplayList();
更新树的数据提供者后。我的代码如下:
<fx:Script>
<![CDATA[
[Bindable]
var treeDataProvider:XML;
private function onTreeCreated(event:FlexEvent):void{
// update value with new XML here;
treeDataProvider = <node name="root">
<node name="child 1">
<node name = "grand child 1"/>
</node>
</node>;
myTree.openItems = treeDataProvider..node;
myTree.validateDisplayList();
}
]]>
</fx:Script>
<mx:Tree id="myTree" labelField="@name" dataProvider={treeDataProvider}
creationComplete="onTreeCreated(event)"/>
这将保持您的整个树打开。
为了下面的代码片段
var openItems:Object = tree.openItems;
tree.dataProvider = myNewDataProvider;
tree.openItems = openItems;
tree.validateNow();
或
callLater(keepOpenStateItems);
private function keepOpenStateItems():void {
tree.openItems = openTreeItems;
}
工作,你必须遵循mattbilson和米歇尔建议。他们是绝对正确的。
刚刚实现了包含在树形数据提供者中的对象的IUID,瞧! 集合刷新保持树真正处于之前的状态。
- 1. flex:深入数据提供者数组
- 2. Flex 4 - 数据提供者更改时的调用函数
- 3. Flex组合框 - 刷新数据提供者
- 4. 即使当我更新父状态时,子组件也会保存状态
- 5. Flex数据网格排序在数据提供者更改中未保留
- 6. Flex数据提供者缓存问题
- 7. 具有对象数组作为数据提供者的Flex DataGridColumn
- 8. Flex 4将数据提供者保存在内存中
- 9. Flex 3.5.0;更新数据提供者更改后的ComboBox显示列表
- 10. 在PHP中更新数据库后保持注销状态
- 11. 有没有办法在Flex列表中自动更新数据提供者?
- 12. 添加数据时刷新ExpandableListView:保持状态
- 13. React获取状态提供者方法
- 14. 读取kendoUI treeview数据源并保持树状态
- 15. 更新ReactJS状态数组
- 16. 当我更改selectOneButton组件的状态时,无法更新我的组件
- 17. Flex 4 - 使用非XML数据提供者扩展树的孩子
- 18. Xcode - 当我有多个目标时保持组织状态
- 19. 提供实时游戏状态更新的服务器
- 20. 套接字。当我需要数据包时,数据包保持队列状态
- 21. Reactjs - 在子组件更新状态时,父componend状态改变
- 22. 更改状态时,Radiobutton /复选框保持选中状态
- 23. python解压缩文件并提供更新到wxPython状态栏
- 24. 具有动态数据更新的Flex组件
- 25. Flex 3根据匹配属性列出数据提供者
- 26. PHP:更新Twitter状态,同时保持特殊字符不变
- 27. 如何保证提供数据的aws lambda调用者保持安全
- 28. 当孩子(第三方)组件状态改变时如何更新父组件
- 29. 任何可以从FB内容提供者获取状态更新的方法?
- 30. 确定Flex 3中树组件的dropIndicator的状态3
您是否在更新期间设置了全新的dataProvider?例如: myTree.dataProvider = myCollection; – 2009-02-15 18:06:19
是的,我正在设置一个新的dataProvider,相同的基本结构只是有更多或更少的节点 – Ronn 2009-02-15 20:15:51