1

我将如何保持树控件的状态?我想在树的数据提供者更新时保持树的状态,而不是崩溃。

4

8 回答 8

3

How about something like this :

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

I'm not sure how well this will work if the new dataProvider is radically different from the old one, but it works when you're lazy loading tree nodes.

于 2009-02-15T18:25:39.987 回答
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)"/>

这将使您的整个树保持打开状态。

于 2011-07-29T02:04:36.673 回答
1

For a Project with BlazeDS I had to work with updating and reloading Tree component data without breaking the User Experience (all nodes closed when data reloaded). Instead of keeping tabs on “which node was opened before?” and “what was the scroll-position?” I found a way to inject the new state of the Tree component data into the existing data provider.

Read the article here if you are interested.

于 2010-08-29T17:00:34.153 回答
1

这实际上很容易做到。您只需要确保组件绑定到它的 dataProvider,而不仅仅是引用它。因此,在 mxml 中,这是用于分配 dataProvider 的花括号语法。此外,DP 必须是 [Bindable]。

如果你这样做,任何时候你更新(添加节点,删除,重命名,等等)你的数据提供者,它都会在你的控制中自动更新。无需手动失效或更新。

如果您需要实际的代码示例,请告诉我。

于 2009-02-25T05:35:31.440 回答
0

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

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

于 2010-08-04T11:55:22.280 回答
0

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

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

isItemOpen(item:Object):Boolean, 

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

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

于 2009-02-15T16:29:42.403 回答
0

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

希望这是有道理的。

于 2009-12-14T21:12:56.320 回答
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 的建议。他们是绝对正确的。

刚刚实现了树 dataprovider 中包含的对象的 IUID,瞧!集合刷新使树真正保持在以前的状态。

于 2013-08-09T08:11:46.363 回答