Вопрос рекурсии для Flex Tree - PullRequest
0 голосов
/ 30 марта 2011

У меня есть следующий 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. Мне нужно отфильтровать "шаги", любые узлы "массива" и "предварительные диалоги". Они не должны появляться на дереве, но их дети должны. Я расширил 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;
}

Этот код успешно отфильтровывает "шаги" и "массив". Однако, если я раскомментирую код «preDialogues», чтобы попытаться отфильтровать preDialogues, вопросный узел будет полностью пропущен. Я понимаю, почему это происходит, но что я могу с этим поделать? Это было некоторое время, так как я сделал рекурсию. Я думал, что смогу вернуть какой-то комбинированный список или что-то в этом роде, но я ничего не могу заставить работать. Спасибо.

1 Ответ

1 голос
/ 30 марта 2011

Он пропускается, потому что вы находитесь на уровне узла "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 и продолжает итерацию, а не просто возвращает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...