【问题标题】:Recursion question for Flex TreeFlex 树的递归问题
【发布时间】:2011-03-29 22:39:47
【问题描述】:

我有以下 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;
}

此代码成功过滤掉“步骤”和“数组”。但是,如果我取消注释“pre​​Dialogues”代码以尝试过滤掉 preDialogues,问题节点将被完全跳过。我知道为什么会发生这种情况,但我能做些什么呢?自从我完成递归以来已经有一段时间了。我以为我可以返回某种组合列表或其他东西,但我什么也做不了。谢谢。

【问题讨论】:

    标签: apache-flex recursion tree


    【解决方案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 并继续迭代,而不是简单地返回。

    【讨论】:

    • 非常接近!非常感谢你。唯一的补充是由于 getChildren 返回一个 iCollectionView,我必须遍历该对象并将每个子对象单独添加到 retXMLList。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 2020-04-08
    • 2021-03-17
    • 1970-01-01
    • 2012-08-04
    相关资源
    最近更新 更多