Flex Tree的递归问题

时间:2011-03-29 22:39:48

标签: flex recursion tree

我有以下xml:

<objects>
    <property name="steps">
      <property name="array">
        <object type="com.tn.assistant.models.Step">
          <property name="preDialogues">
            <property name="array">
              <object type="com.tn.assistant.models.Dialogue"/>
            </property>
          </property>
          <property name="question">
            <object type="com.tn.assistant.models.Question">
            </object>
          </property>
        </object>
      </property>
    </property>
 </objects>

我在Flex 4 / air应用程序中使用树来显示它。我需要过滤掉“步骤”,任何“数组”节点和“preDialogues”。他们不应该出现在树上,但他们的孩子应该。我扩展了DefaultDataDescriptor,并覆盖了getChildren(),以成功过滤步骤和数组标记。

override public function getChildren(node:Object, model:Object=null):ICollectionView
{
    var ch:XMLList = new XMLList (node.xns::*);
    var retXMLList:XMLList = new XMLList();
    var retXMLListCtr = 0;
    for (var i = 0; i < ch.length(); i++){
        if (ch[i].@name == "array"){
            return getChildren(ch[i]);
        }

        else if (ch[i].@name == "steps"){
            return getChildren(ch[i]);
        }
/*
        else if (ch[i].@name == "preDialogues"){
            return getChildren(ch[i]);
        }
*/
        else {
            retXMLList[retXMLListCtr] = ch[i];
            retXMLListCtr++;
        }
    }
    var chil:XMLListCollection = new XMLListCollection (retXMLList);
    var chil2:ICollectionView = ICollectionView(chil);
    return chil2;
}

此代码成功过滤掉“steps”和“array”。但是,如果我取消注释“pre​​Dialogues”代码以尝试过滤掉preDialogues,则完全跳过问题节点。我可以看出为什么会发生这种情况,但我该怎么办呢?自从我完成递归以来已经有一段时间了。我以为我可以返回某种组合列表,或者某种东西,但我无法获得任何工作。感谢。

1 个答案:

答案 0 :(得分:1)

它被跳过了,因为你处于“com.tn.assistant.models.Step”节点的级别。当你迭代那个节点的子节点时,在这种情况下,“preDialogues”和“question”,你来到的第一个只是返回它的子节点(在这种情况下,preDialogues的子节点)。它甚至从未达到检查“问题”的程度。

好像你想要更像的东西:

override public function getChildren(node:Object, model:Object=null):ICollectionView
{
    var ch:XMLList = new XMLList (node.xns::*);
    var retXMLList:XMLList = new XMLList();
    var retXMLListCtr = 0;
    for (var i = 0; i < ch.length(); i++){
        var name:String = String(ch[i].@name);
        if (name == "array" ||
            name == "steps" ||
            name == "preDialogues" ||
            name == "question") {
            retXMLList[retXMLListCtr] = getChildren(ch[i]);
        } else {
            retXMLList[retXMLListCtr] = ch[i];
        }
        retXMLListCtr++;
    }
    var chil:XMLListCollection = new XMLListCollection (retXMLList);
    var chil2:ICollectionView = ICollectionView(chil);
    return chil2;
}

它仍然遍历每个子节点,但当它到达“数组”节点时,它将其子节点添加到retXMLList并继续迭代,而不是简单地返回。