2017-01-24 80 views
0

我正在维护一个较大的传统Flex 4.6项目,该项目拒绝死亡,并且遇到了Mx Tree组件,我无法解决该问题。要点是,将项目添加到现有节点展品奇怪的行为,如果项目是重复的。如果节点是使用唯一项目创建的,则该组件的行为与预期相同。将重复项添加到现有节点时Mx树失败

例如,下图显示了将文件“AAAAA.png”多次添加到现有节点的结果。突出显示是疯狂的,组件似乎对它有多少项目感到困惑(已经测试过)。

我试过重新设置数据提供程序等的“刷新树”破解(下图),我在各种支持Array Collections上调用刷新。我开始走下去,用一个Spark Tree代替Mx Tree,这是一个人想出来的,但它变成了太多的时间。

在我告诉客户放弃这个功能之前,有没有人想过这个问题可能是什么?我比Flex开发人员更喜欢Actionscript,除了使用它们之外,我不了解组件的方式。

enter image description here


protected function vfAddToBtn_clickHandler(event:MouseEvent):void 
    { 
     if (virtualFoldersList.selectedItem == null){ 
      Alert.show("Please select a virtual folder to add to", "Add to Virtual Folder", Alert.OK); 

     } else { 
      if (briefcaseData.currentSelectionsList.length > 0){ 
       var vf:VirtualFolder = virtualFoldersList.selectedItem as VirtualFolder; 

       if (vf != null){ 
        vf.children.addAll(briefcaseData.currentSelectionsList); 
        vf.children.refresh(); 
        briefcaseData.virtualFoldersArray.refresh(); 
        refreshTree(virtualFoldersList); 

       } else { 
        trace("ERROR: vfAddToBtn_clickHandler vf is null"); 
       } 
      } 
     } 
    } 

 private function refreshTree(tree:Tree) : void 
     { 
      var selectedIndex : int = tree.selectedIndex; 
      var openItems : Object = tree.openItems; 
      tree.dataProvider = tree.dataProvider; 
      tree.openItems = openItems; 
      tree.validateNow(); 
      tree.selectedIndex = selectedIndex; 
     } 

回答

0

答案是...,从Flex的4.6 MX的Flex的树是刚刚打破。我尝试了一切,甚至从我试图合并的两个ArrayCollections的源数组中创建一个新的ArrayCollection(下面的代码)。结果是一样的:如果存在重复项目,则组件中突出显示的翻转项目是错误的,组件会对其包含的项目感到困惑。

唉。


protected function vfAddToBtn_clickHandler(event:MouseEvent):void 
      { 
       if (virtualFoldersList.selectedItem == null){ 
        Alert.show("Please select a virtual folder to add to", "Add to Virtual Folder", Alert.OK); 

       } else { 
        if (briefcaseData.currentSelectionsList.length > 0){ 
         var vf:VirtualFolder = virtualFoldersList.selectedItem as VirtualFolder; 

         if (vf != null){ 

          var temp: Array = new Array(); 
          var sourceArray: Array; 
          var i:int; 

          if (vf.children.length > 0){ 
           sourceArray = vf.children.source; 
           for (i=0; i < sourceArray.length; i++){ 
            temp.push(sourceArray[i]); 
           } 
          } 

          sourceArray = briefcaseData.currentSelectionsList.source; 
          for (i=0; i < sourceArray.length; i++){ 
           temp.push(sourceArray[i]); 
          } 

          vf.children = new ArrayCollection(temp); 
          vf.children.refresh(); 
          briefcaseData.virtualFoldersArray.refresh(); 
          refreshTree(virtualFoldersList); 

         } else { 
          trace("ERROR: vfAddToBtn_clickHandler vf is null"); 
         } 
        } 
       } 
      } 
0

是briefcaseData.currentSelectionsList的XMLList或XML?

相应地使用新的XML/XMLList中在下面一行

vf.children.addAll(briefcaseData.currentSelectionsList) 

vf.children.addAll(new XMLList(briefcaseData.currentSelectionsList)) 
+0

这是一个'ArrayCollection' –

+0

然后使用该行vf.children.addAll(新的ArrayCollection(briefcaseData.currentSelectionsList)) – Sumit

+0

谢谢 - 我只是想,一个更(创建一个新的'的ArrayCollection '我想合并的'ArrayCollections'的来源),而'Mx Tree'仍然对重复项目感到困惑。 –

0

我已经创建了我前面给出的答案一个示例应用程序,它是对我工作的罚款。请检查这个代码。

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" 
      creationComplete="creationCompleteHandler(event)"> 
<s:layout> 
    <s:VerticalLayout /> 
</s:layout> 
<fx:Declarations> 
    <fx:XML id="xmlData"><list> 
     <department title="Finance" code="200"> 
      <employee name="John H"/> 
      <employee name="Sam K"/> 
     </department> 
     <department title="Operations" code="400"> 
      <employee name="Bill C"/> 
      <employee name="Jill W"/> 
     </department> 
     <department title="Engineering" code="300"> 
      <employee name="Erin M"/> 
      <employee name="Ann B"/> 
     </department> 
    </list></fx:XML> 
    <fx:XML id="empData"><employee></employee></fx:XML> 
</fx:Declarations> 
<fx:Script> 

    import mx.collections.XMLListCollection; 
    import mx.events.FlexEvent; 

    [Bindable] 
    private var company:XML; 
    [Bindable] 
    private var companyData:XMLListCollection; 

    private function treeLabel(item:Object):String { 
     var node:XML = XML(item); 
     if (node.localName() == "department") 
      return [email protected]; 
     else 
      return [email protected]; 
    } 

    private function addEmployee():void { 
     if (tree.selectedItem.localName() == "employee") 
      return; 
     var newNode:XML = new XML(empData); 
     [email protected] = empName.text; 
     var dept:XMLList = XMLList(tree.selectedItem); 
     if (dept.length() > 0) { 
      dept.appendChild(newNode); 
      empName.text = ""; 
     } 
     companyData.refresh(); 
    } 

    private function removeEmployee():void { 
     var node:XML = XML(tree.selectedItem); 
     if (node == null) 
      return; 
     if (node.localName() != "employee") 
      return; 
     var children:XMLList = XMLList(node.parent()).children(); 
     for (var i:Number = children.length() - 1; i >= 0; i--) { 
      if (children[i][email protected] == [email protected]) { 
       delete children[i]; 
      } 
     } 
    } 

    private function creationCompleteHandler(event:FlexEvent):void { 
     company = new XML(xmlData); 
     companyData = new XMLListCollection(company.department) 
    } 
</fx:Script> 
<mx:Tree id="tree" top="72" left="50" dataProvider="{companyData}" 
     labelFunction="treeLabel" height="225" width="300" 
     defaultLeafIcon="{null}" folderClosedIcon="{null}" 
     folderOpenIcon="{null}"/> 
<mx:VBox> 
    <mx:HBox> 
     <mx:Button label="Add Operations Employee" click="addEmployee();" /> 
     <mx:TextInput id="empName" /> 
    </mx:HBox> 
    <mx:Button label="Remove Selected Employee" click="removeEmployee();" /> 
</mx:VBox>