GoJS удаляет дочерние узлы, не зная ключа родительского узла

У меня есть диаграмма goJS с пользовательской моделью. При перетаскивании узла на другой узел я связываю их, когда срабатывает mouseDrop, и устанавливаю from и to в данных ссылки на диаграмме.модель:

mydiagram.model.addLinkData({ from: oldNodeModel.key, to: dragNodeModel.key });

Это все работает нормально. В моем шаблоне узла у меня есть собственный шаблон, который помещает панель вокруг узлов с кнопкой удаления. Эта кнопка удаления представляет собой просто изображение с событием щелчка.

Теперь, когда я нажимаю кнопку удаления изображения/кнопки, я хочу удалить это сейчас и все его дочерние узлы.

Моя проблема в том, что я не могу найти детей.

У меня есть пользовательские события, такие как findNodesOutOf, которые не дают результатов, и findNodesConnected, которые находят родительские и дочерние узлы и удаляют партию - это не то, что мне нужно.

Есть идеи, как я могу это решить?


person Community    schedule 14.02.2015    source источник
comment
Вы уже предоставили ключ к этому решению. В вашей модели у вас есть ключи от и до узла. Почему бы просто не проверить это?   -  person loan.burger    schedule 14.02.2015
comment
Я не могу найти дочерние узлы для проверки ссылок   -  person    schedule 14.02.2015
comment
Используйте рекурсивную функцию для проверки каждого из них.   -  person loan.burger    schedule 14.02.2015


Ответы (1)


Вы можете получить элемент для удаления, используя диаграмму. выбор:

var nodeToDelete = mydiagram.selection.iterator.first();

Затем, чтобы найти всех дочерних элементов этого узла, я рекомендую рекурсивную функцию, которая будет делать следующее:

  1. Возьмите узел, который вы хотите удалить,
  2. Найдите все подключенные к нему узлы, используя mydiagram.getChildrenNodes(nodeToDelete)
  3. Итерация через cconnected узлы
  4. Проверьте, является ли каждый узел дочерним, используя linkNodeModel и проверив, идет ли ссылка от текущего узла к дочернему узлу.
  5. Затем снова вызовите рекурсивную функцию с этим дочерним узлом.
  6. Рекурсивная функция вернет массив со всеми дочерними узлами

Затем вы можете удалить их.

Ваш код будет выглядеть примерно так:

function deleteNode()
{
    // TAKE NOTE - This will get all selections so you need to handel  this
    // If you have multiple select enabled
    var nodeToDelete = mydiagram.selection.iterator.first();    
    var childNodes = getChildNodes(deletedItem);

    //Remove linked children
    $.each(childNodes, function()
    {
         myDiagram.remove(this);
    });

    // Then also delete the actual node after the children was deleted
    // TAKE NOTE - This will delete all selections so you need to handle this
    // If you have multiple select enabled
    mydiagram.commandHandler.deleteSelection();
}

Рекурсивная функция продолжает проверять каждый узел на наличие дочерних элементов и добавляет их в массив:

function getChildNodes(deleteNode)
{
    var children = [];
    var allConnected= deleteNode.findNodesConnected();

    while (allConnected.next())
    {
        var child = allConnected.value;

        // Check to see if this node is a child:
        if (isChildNode(deleteNode, child))
        {
            // add the current child
            children.push(child);

            // Now call the recursive function again with the current child
            // to get its sub children
            var subChildren = getChildrenNodes(child);

            // add all the children to the children array
            $.each(subChildren, function()
            {
                children.push(this);
            });
       }
   }

    // return the children array
    return children;
}

Эта функция проверит, является ли узел дочерним, просматривая ссылки на диаграмме и проверяя «к» и «от» к текущему узлу и дочернему узлу:

function isChildNode(currNode, currChild)
{
    var links = myDiagram.links.iterator;
    while (links.next())
    {
        // Here simply look at the link to determine the direction by checking the direction against the currNode and the child node. If from is the current node and to the child node
        // then you know its a vhild
        var currentLinkModel = links.value.data;
        if (currentLinkModel.from === currNode.data.key &&   currentLinkModel.to === currChild.data.key)
        {
             return true;
        }
    }
    return false;
}
person loan.burger    schedule 14.02.2015
comment
мм я бы не подумал использовать рекурсивную функцию, я не слишком знаком с ними, но это работает, так что спасибо. - person ; 14.02.2015