fancytree - обновляет данные дочернего узла и отправляет их обратно - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь реализовать Fancy Tree, который отображает данные в древовидной структуре, а также сохраняет обновленные дочерние данные. Мне нужно это в запросе, чтобы обновить в базе данных.

В моем дереве Fancy есть 3 уровня. 3-й уровень имеет ребенка с дополнительными парами JSON Key-Value. Это выглядит так:

                   Color        Height      Comments  
Category-1
    Plants1                         
        Lily        White       5           test-lily
        Hibiscus    Yellow      8           test
    Animals1
        Rabbit      White       20          test-some-comments
        Squirrel    Brown       3           some-other-comments
        ...
Category-2          
    Plants2
        Jasmine     White       5           test-jasmine
        Hibiscus    Yellow      8           test
    Animals2
        Cat         White       15          test-some-comments
        Dog         Brown       12          some-other-comments
        ...
 ...

Цвет, высота, комментарии - это редактируемые текстовые поля. Пользователь может

  • Обновить любые редактируемые данные.
  • Добавить новое растение / животное и назначить новый цвет, высоту, данные комментариев.

I должен иметь возможность применить новые данные к узлу (обновить узел). Я вижу, что в пользовательском интерфейсе отображаются новые данные, но когда я проверяю значение элемента не обновляется ??

Я должен иметь возможность взять все данные причудливого дерева и отправить их в запросе.

Я попытался автоматически выбрать все узлы и получить выбранные узлы, я получаю только заголовки (Lily / Rabbit), я не получаю обновленный цвет, высоту и комментарии.

Я не уверен, как вызвать редактирование ( изменить) для пары ключ-значение внутри дочернего элемента.

Кроме того, когда я перемещаю дочерние элементы (на уровне - 3) - существует ли способ автоматического исправления иерархии индексов?

Приветствуется любая помощь.

Снова выделение вопросов:

  • Обновление данных значения ключа в дочернем узле
  • Читать полностью Необычное дерево с новыми данными и отправьте его в запросе
  • Автокоррекция иерархии индексов при перемещении вверх / вниз или перемещении под другим родителем

1 Ответ

0 голосов
/ 27 марта 2020

Мне удалось реализовать решение, которое работает так, как я ожидал.

Вот мое решение:

Когда пользовательский ввод является цветным, реализуйте метод onChange в текстовом поле цвета, чтобы установить данные узла для ввода данных пользователем My HTML Таблица имеет значение ниже tds

     <td width="150px"><input type="text" size='30' onChange="updateNode(this, 'color');"/ </td>
     <td width="150px"><input type="text" size='30' onChange="updateNode(this, 'height');"/></td>
     <td width="150px"><input type="text" size='30' onChange="updateNode(this, 'comments');"/></td>

Вот функция updateNode

  function updateNode(cur,key)
  {
      var val = document.getElementById(cur.id).value; 
      var tree = $("#tree").fancytree("getTree");
      var node = tree.getActiveNode();

      if(key === "color")
      {
          node.data.color= val;
      }
      else if(key === "height")
      {
          node.data.height = val;
      }
      // else and so on...
      return false;

  }

В методе fancytree renderColumns - добавьте атрибуты id и значения для каждого входа на основе в IndexHierarchy

это то, как вы это делаете

 $tdList.eq(2).find("input").attr("id","color-"+node.getIndexHier());
 $tdList.eq(2).find("input").attr("value",node.data.color);
 $tdList.eq(3).find("input").attr("id","height-"+node.getIndexHier());
 $tdList.eq(3).find("input").attr("value",node.data.height);
 $tdList.eq(4).find("input").attr("id","comments-"+node.getIndexHier());
 $tdList.eq(4).find("input").attr("value",node.data.comments);

Теперь, когда пользователь нажимает «SAVE»

$("#save").click(function(){
     var tree = $("#tree").fancytree("getTree");
     var rtNode = tree.getRootNode();
     //var nodeList = tree.getAllNodes(); //My custom implementation method
     tree.expandAll(); //you have to do this to be able to read all nodes
     var seq = 0;
     var categoryName = "";
     var subCategoryName = ""; //Plants, Animals etc.,
     var jsonArray = new Array();
     var categoryNodes = rtNode.getChildren();
     for(var i=0; i< categoryNodes.length; i++)
     {
        categoryName =categoryNodes[i].title;
        var subCategoryNodes = categoryNodes[i].getChildren();
        if(!subCategoryNodes)
        {
            //error if at least one child is mandatory
        }
        for(var j=0; j < subCategoryNodes.length; j++)
        {
            seq++;
            subCategoryName = subCategoryNodes[j].title;
            var sCtgryChildren = subCategoryNodes[j].getChildren();                 
            if(!sCtgryChildren)
            {
            //error if at least one child is mandatory
            }
            for(var k=0; k < sCtgryChildren.length; k++)
            {
                var ind = sCtgryChildren[k].getIndexHier();
                var subCategoryChildName = sCtgryChildren[k].title;
                var color = sCtgryChildren[k].data.color;//document.getElementById("color-"+ind).value; - this is another way
                var height = document.getElementById("height-"+ind).value;
                var comments = document.getElementById("comments-"+ind).value;
                var jsonBean = new jsonBeanJO(seq, categoryName, subCategoryName, color, height, comments); // define your own JSON bean
                jsonArray.push(jsonBean);
            }
        }
     }          
      alert(JSON.stringify(jsonArray));
      return false; // test in UI and remove when you have expected data
      // to send back in request
      document.getElementById('data').value = JSON.stringify(jsonArray);
      document.myform.submit();
});

Наконец, для автоматического обновления иерархии индексов, когда Вы перемещаете узел вверх или вниз, просто вызываете рендер узла в modifyChild

 modifyChild: function(event, data) 
 {
    data.node.render(true); //This statement made all the difference
    data.tree.info(event.type, data);
 },
...