узлы jstree — tree воссоздаются после добавления нового узла или удаления существующего

#javascript #jquery #jstree

#javascript #jquery #jstree

Вопрос:

я построил дерево с узлами, используя jstree. пользователь может выбрать цвет фона узла с помощью выбора цвета в контекстном меню. К сожалению, я заметил, что когда создается новый узел или удаляется другой, дерево, похоже, воссоздается. действительно, материалы css теряются, и вещи, добавленные в node.data тоже.

как я могу предотвратить это?

это мой код:

 function treeCreation(){
  var core = {
    'check_callback': true,
  };
  var plugins = [
    "contextmenu", "dnd", "search",
    "state", "types", "wholerow"
  ];
  var types = {
    "default": {
      'max_depth': 1
    }
  };
  var contextmenu = {         
    "items": function($node) {
      var tree = $("#tree").jstree(true);
      return {
          "Create": {
              "separator_before": false,
              "separator_after": false,
              "label": "Create",
              "action": function (obj) { 
                  $node = tree.create_node($node);
                  tree.edit($node);
              }
          },
          "Rename": {
              "separator_before": false,
              "separator_after": false,
              "label": "Rename",
              "action": function (obj) { 
                  tree.edit($node);
              }
          },                         
          "Remove": {
              "separator_before": false,
              "separator_after": false,
              "label": "Remove",
              "action": function (obj) { 
                  tree.delete_node($node);
              }
          },
          "Color": {
              "separator_before": false,
              "separator_after": false,
              "label": "Color",
              "action": function (obj) {
                $('#colorpicker').trigger('click');
              }
          }
      };
    }
  };
  var animation = 400;
  $('#tree').jstree({
    "plugins" : plugins, 
    'core': core,
    'animation': animation,
    'types': types,
    'contextmenu': contextmenu
  });   
}
  

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

Ответ №1:

Ответ на этот вопрос был дан в Github.
В основном способ заключается в создании плагина для jstree, который переопределяет функцию перерисовки.

В моем случае использования мне нужно было сделать каждый узел удаляемым (jquery-ui), поэтому я сделал это:

 (function ($, undefined) {
  "use strict";
  $.jstree.defaults.droppable = {};
  $.jstree.plugins.droppable = function (options, parent) {
    this.redraw_node = function(obj, deep, callback, force_draw) {
      var i, j, tmp = null;
      obj = parent.redraw_node.call(this, obj, deep, callback, force_draw);
      if(obj) {
        for(i = 0, j = obj.childNodes.length; i < j; i  ) {
          if(obj.childNodes[i] amp;amp; obj.childNodes[i].className amp;amp; obj.childNodes[i].className.indexOf("jstree-wholerow") !== -1) {
            tmp = obj.childNodes[i];
            break;
          }
        }
        if(tmp) {
          $(tmp).droppable({
            accept: '.my-css-selector',
            drop: myDropCallback
          });
        }
      }
      return obj;
    };
  };
})(jQuery);
  

Затем при создании jstree вам необходимо объявить свой пользовательский плагин:

 $('#my-tree').jstree({
  ...
  plugins: ['droppable']
  ...
})