2017-01-30 160 views
1

我有一棵树。jsTree创建文件夹 - 在用户输入名称前创建的文件夹

我可以创建一个文件夹。

但是,这样做存在问题。 jsTree下载中包含的filebrowser演示中也存在此问题。

这是一个用户体验问题,所以我希望我可以很好地描述它。

1)中创建他们想要新文件夹 上的节点/文件夹的用户点击。

2)他们从上下文菜单中选择“New-> Folder”。 3)此时,在后台,jsTree用默认名称“New node”触发 “create_node.jstree”事件。 create_node.jstree事件确实ajax返回到web api,并且在文件系统上创建了一个 文件夹。

4)但是,在页面上,用户正在查看的字段是 ,提示用户输入节点/文件夹的自定义名称。

5)一旦用户输入名称,页面上的节点被更新,但 jsTree不会再次调用后端来重命名该文件夹。

结果是一个名为节点“,并要求在文件系统上的文件夹‘新节点’

什么会更合适:用户输入客户端节点只有在

/文件夹名称确实jsTree 呼吁create_node.jstree事件。

这将使我的后端代码来执行,故障排除和报告成功/ failu重新命名为用户所需的文件夹。

代码剪 的create_node事件

$('#mytree').on('create_node.jstree', function (e, dta) { 
     $.get('/<whatever>/FolderBrowser?operation=create_node', { 'type': dta.node.type, 'id': dta.node.parent, 'text': dta.node.text }) 
      .done(function (d) { 
       dta.instance.set_id(dta.node, d.id); 
      }) 
      .fail(function() { 
       dta.instance.refresh(); 
      }); 
    }); 

和树本身

$('#mytree').jstree(.... 
, 'contextmenu': { 
    'items': function (node) { 
     var tmp = $.jstree.defaults.contextmenu.items(); 
     delete tmp.rename; 
     delete tmp.remove; 
     delete tmp.ccp; 
     tmp.create.label = "New Folder"; 
     tmp.create.action = function (dta) { 
      // I have $10 for you if you can comprehensively explane everything going on in the following. 
      var inst = $.jstree.reference(dta.reference) 
      var obj = inst.get_node(dta.reference); 
      inst.create_node(obj, { type: "default" }, "last", function (new_node) { 
       setTimeout(function() { inst.edit(new_node); }, 0); 
      }); 
     } 
     return tmp; 
    } 

    , 'check_callback': function (o, n, p, i, m) { 
     if (m && m.dnd && (m.pos !== 'i')) 
      return false; 
     /* not allowed options for this application 
     if(o === "move_node" || o === "copy_node") { 
      if(this.get_node(n).parent === this.get_node(p).id) { return false; } 
     } 
     */ 
     return true; 
    } 

回答

0

jsTree工作,因为你描述它漂亮多了。

1)调用后端实际创建文件夹的默认名称为 。此时您可以发送成功/失败返回到页面。

2)成功后,再次调用后端将文件夹重命名为 用户所需的名称。此时您可以再次发送成功/失败。

您的代码不包含需要重命名的工具。 将rename_node.jstree事件添加到您的代码中。和其他必要的位。

但是,根据代码中的注释,您不必将“重命名”作为上下文菜单选项。