Javascript jsTree自定义上下文菜单未根据文件夹/文件类型进行筛选

Javascript jsTree自定义上下文菜单未根据文件夹/文件类型进行筛选,javascript,jstree,Javascript,Jstree,我正在尝试为jsTree配置自定义上下文菜单。我希望文件有两个选项[重命名,删除],文件夹有一个选项[创建] 下面的代码似乎正确,如下所述: 然而,这似乎不起作用,有两个问题 两个上下文菜单都显示选项[重命名、删除] 任选其一 导致错误的原因:未捕获类型错误:未定义不是函数 我做错了什么? 编辑:这里有一个 好的,所以答案是jstree不会隐式区分文件和文件夹。如果要进行区分,需要添加标识符和自定义逻辑 为了实现这一点,我向每个数据对象添加了以下内容 "data" : { "file" : t

我正在尝试为jsTree配置自定义上下文菜单。我希望文件有两个选项[重命名,删除],文件夹有一个选项[创建]

下面的代码似乎正确,如下所述:

然而,这似乎不起作用,有两个问题

  • 两个上下文菜单都显示选项[重命名、删除]
  • 任选其一 导致错误的原因:未捕获类型错误:未定义不是函数
  • 我做错了什么? 编辑:这里有一个


    好的,所以答案是jstree不会隐式区分文件和文件夹。如果要进行区分,需要添加标识符和自定义逻辑

    为了实现这一点,我向每个数据对象添加了以下内容

    "data" : { "file" : true }
    
    于是,定制逻辑变得更加复杂

    if (node.data.file) {
        delete items.createItem;
    }
    
    else{
        delete items.deleteItem;
        delete items.renameItem;
    }
    
    此外,我执行自定义操作的方式是错误的。我通过查看jstree()的源代码发现了这一点。要启用创建和删除,必须设置“检查回调”:true。例如,您可以实现如下创建操作

    createItem: { // The "create" menu item
                            label: "Create",
                            action: function (data) {
                                var inst = $.jstree.reference(data.reference),
                                        obj = inst.get_node(data.reference);
                                inst.create_node(obj, {}, "last", function (new_node) {
                                    new_node.data = {file: true};
                                    setTimeout(function () { inst.edit(new_node); },0);
                                });
                            }
                        },
    
    在这里工作

    createItem: { // The "create" menu item
                            label: "Create",
                            action: function (data) {
                                var inst = $.jstree.reference(data.reference),
                                        obj = inst.get_node(data.reference);
                                inst.create_node(obj, {}, "last", function (new_node) {
                                    new_node.data = {file: true};
                                    setTimeout(function () { inst.edit(new_node); },0);
                                });
                            }
                        },