JSTree - DND не принимает возврат

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

  • Папка
  • Проект
  • Работа

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

  • Папки могут иметь дочерние элементы типа «папка» и «проект».
  • Проекты могут иметь дочерние элементы только типа «работа».
  • Джобс не может иметь детей

Проблема: JSTree игнорирует логические значения, которые я возвращаю, и разрешает DND для всех элементов. Обычно возврат "false" устанавливает красный X, а также запрещает удаление, но это не так. Я написал возврат моей функции checkNodeCB() в консоль, и моя логика истинного/ложного кажется верной. Смотрите мой код ниже:

  core: {
     check_callback: function(e,node,parent,position,more){
        function checkNodeCB(oNode,tNode){
          if(tNode.type === "folder" && oNode.type !== "job"){
             //console.log("I want to place a "+oNode.type+" inside a folder");
             return true;
          }
          if(tNode.type === "project" && oNode.type === "job"){
             //console.log("I want to place a job under a project");
             return true;
          }
          return false;
        };
        if((e === 'copy_node' || e === 'move_node') && more.dnd){
           if (oldNode !== more.ref.id){
              oldNode = more.ref.id; //Set the oldNode to the current ID so it no longer executes
              //console.log(checkNodeCB(node.original,more.ref.original));
              return checkNodeCB(node.original,more.ref.original);
           }
        }
        return true;
     },
     worker: true
  },
  dnd:{
     check_while_dragging:true
  },

person Shaidar    schedule 13.04.2015    source источник


Ответы (1)


Как и каждый момент просветления, я отошел, чтобы позаботиться о матери-природе, и понял, что я делаю неправильно. Я пытался сделать свой код более эффективным, выполняя функцию checkNodeCB() только тогда, когда моя мышь перемещалась по другому узлу, и не принимал во внимание, что возвращаемое значение по-прежнему устанавливается в значение true вне функции. Код не идеален, но вот что у меня получилось.

     check_callback: function(e,node,parent,position,more){
        function checkNodeCB(oNode,tNode){
          if(tNode.type === "folder" && oNode.type !== "job"){
             outPut = true;
          }
          if(tNode.type === "project" && oNode.type === "job"){
             outPut = true;
          }else{
             outPut = false;
          }
        };
        if((e === 'copy_node' || e === 'move_node') && more.dnd){
           if (oldNode !== more.ref.id){
              oldNode = more.ref.id; //Set the oldNode to the current ID so it no longer executes
              checkNodeCB(node.original,more.ref.original);
           }
           return outPut; //Use the output variable so the state persists when moving the mouse over the current "hovered" node
        }
        return true;
     },
person Shaidar    schedule 14.04.2015