2009-02-15 87 views
1

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

+0

您是否在更新期间设置了全新的dataProvider?例如: myTree.dataProvider = myCollection; – 2009-02-15 18:06:19

+0

是的,我正在设置一个新的dataProvider,相同的基本结构只是有更多或更少的节点 – Ronn 2009-02-15 20:15:51

回答

0

我不认为有一种方法可以自动执行此操作(虽然我从来不必使用树控件)。我认为你最好的选择是扩展树形控件并处理你自己的状态记录。

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

isItemOpen(item:Object):Boolean, 

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

你需要通过递归的每个节点上运行,并检查它的开放和存储该节点的状态。然后,当它重新绘制新的数据提供程序时,递归地运行新节点并检查它们之前是否有任何之前打开过,如果是,则展开它们。

3

怎么是这样的:

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

我不知道有多好,如果新的数据提供程序是从旧的完全不同,这将工作,但它的工作原理,当你延迟加载树节点。

+0

+1听起来像是一个很好的电话给我 – 2009-02-15 19:34:04

1

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

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

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

0

您需要在代表节点的数据对象上实现IUID接口。 UID是一个唯一的标识符,通常只是建立在对象中的数据之外,但有时候更准确地覆盖这个标识符并使​​其在数据提供者刷新之间持续存在一些GUID。因此,如果UID匹配,则在使用新的数据提供者时,上述内容将起作用。

希望有道理。

1

对于BlazeDS的,我与更新,并不会破坏用户体验重装Tree组件数据的工作项目(当重新载入数据的所有节点关闭)。 而不是保持“先前打开哪个节点?”和“什么是滚动位置?”选项卡我找到了一种方法将树状组件数据的新状态注入到现有的数据提供程序中。

Read the article here if you are interested

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

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

0

为了下面的代码片段

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

callLater(keepOpenStateItems); 

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

工作,你必须遵循mattbilson和米歇尔建议。他们是绝对正确的。

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

相关问题