Flex:树组件:在数据提供程序更新时保持状态

时间:2009-02-15 15:38:28

标签: flex actionscript-3 flex3

我如何保持树控制的状态? 我希望在数据提供程序更新时保持树的状态,而不是崩溃。

8 个答案:

答案 0 :(得分:3)

这样的事情怎么样:

    var openItems:Object = tree.openItems;
    tree.dataProvider = myNewDataProvider;
    tree.openItems = openItems;
    tree.validateNow();

如果新的dataProvider与旧的dataProvider完全不同,我不确定这会有多好,但是当你加载树节点时,它会起作用。

答案 1 :(得分:2)

以下是我如何使用它。关键是要调用

*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)"/>

这将使整棵树保持开放状态。

答案 2 :(得分:1)

这实际上相当容易。您只需确保将Component绑定到其dataProvider,而不是仅仅引用它。因此,在mxml中,这是用于分配dataProvider的大括号语法。此外,DP必须是[Bindable]。

如果您这样做,只要您更新(添加节点,删除,重命名等)数据提供程序,它就会在您的控件中自动更新。无需手动无效或更新。

如果您需要实际的代码示例,请与我们联系。

答案 3 :(得分:1)

对于使用BlazeDS的项目,我必须在不破坏用户体验的情况下更新和重新加载树组件数据(所有节点在重新加载数据时关闭)。 而不是密切关注“之前打开了哪个节点?”和“滚动位置是什么?”我找到了一种方法将Tree组件数据的新状态注入现有数据提供程序。

Read the article here if you are interested

答案 4 :(得分:0)

我认为没有办法自动执行此操作(尽管我从未使用树控件)。我认为你最好的选择是延长树控制并自己处理状态记录。

例如,我可能会覆盖data属性,以便您可以在组件上设置新数据对象之前运行状态检查功能。看看帮助有方法

isItemOpen(item:Object):Boolean, 

expandItem(item:Object, open:Boolean, animate:Boolean = false, dispatchEvent:Boolean = false, cause:Event = null):void

您需要以递归方式遍历每个节点并检查它是否已打开并存储该节点的状态。然后,当它使用新数据提供程序重新绘制时,递归地运行新节点并检查它们中是否有任何先前打开过,如果是,则展开它们。

答案 5 :(得分:0)

您需要在代表您的节点的数据对象上实现IUID接口。 UID是一个唯一的标识符,通常只是根据对象中的数据构建,但有时更准确地覆盖它并使其成为一些在数据提供程序刷新之间持久的GUID。因此,如果UID匹配,则在使用新的数据提供者时,上述操作将起作用。

希望这是有道理的。

答案 6 :(得分:0)

Inferis的答案涉及存储openItems,然后在更新数据提供程序后再次设置它们,并结合在dataprovider数组集合中的对象上实现IUID接口。

有关IUID的更多信息:http://livedocs.adobe.com/flex/3/html/help.html?content=about_dataproviders_8.html

答案 7 :(得分:0)

为了以下代码段

var openItems:Object = tree.openItems;
tree.dataProvider = myNewDataProvider;
tree.openItems = openItems;
tree.validateNow();

callLater(keepOpenStateItems);

private function keepOpenStateItems():void {
    tree.openItems = openTreeItems; 
}

上班你必须遵循mattbilson和Michelle的建议。他们是完全正确的。

刚刚实现了树数据提供者中包含的对象的IUID,瞧! 集合刷新使树真正处于以前的状态。