jstree - 通过ajax加载contextmenu

时间:2017-03-01 10:04:24

标签: javascript jstree

我正在使用jsTree为客户支持服务构建知识库。为此,我需要能够将每个节点的内容发送到我网站上任何当前活动的用户。

这意味着每次调用节点的上下文菜单时,我都需要它通过ajax获取当前活动的用户,然后将它们显示为菜单项。

现在,我知道contextmenu是节点的一个功能。但是如何将它绑定到ajax函数的结果?

有些事情:

<?php
class A {
    public function foo() {
        echo "x";
    }
}

trait T {
    public function foo() {
        echo "y";
    }
}

class B extends A {
    use T;
    public function foo() {
        echo "z";
    }
}

$test = new B();
$test->foo();

// result z

显然上面的例子不起作用,但你明白了。

文档说菜单可以

  

接受节点和回调函数并调用的函数   具有该节点可用操作对象的回调函数   (你也可以退货)

所以也许有办法挤进我需要的回调?我很难在JS上解决这个问题。

2 个答案:

答案 0 :(得分:1)

我不确定您是否可以通过本机jsTree上下文菜单功能来创建它,因为您进行了异步操作。如果没有更好的解决方案,我会手动构建菜单,如下所示。查看演示 - Fiddle Demo

...
'contextmenu': {
    'items': function(node) {

        // remove default context menu items
        var tmp = $.jstree.defaults.contextmenu.items();
        delete tmp.rename;
        delete tmp.remove;
        delete tmp.ccp;
        delete tmp.create;

        tmp = {
            loading: {
                label: "Wait ..."
            }
        }

        // start ajax
        _loadMenuItems();

        return tmp;
    }
}



function _loadMenuItems() {

    // make ajax call

    // in your success function, where serverData is the data you got:
    $('.vakata-context').html('');

    serverData.forEach(function(item) {
        var menuItem = $('<li><a href="#">' + item.label + '</a></li>');
        menuItem.click(item.action);
        $('.vakata-context').append(menuItem);
    });

}

答案 1 :(得分:-2)

我遇到了完全相同的问题,您可以找到解决方案here

你必须这样做:

contextmenu: {
    items: function (node, buildContextMenu) {
        var entries= {};

        $.ajax({
            url: "...",
            data: node.id,
            success: function () {
                // Construct the entries
                ...

                buildContextMenu(entries); // <--- SOLUTION
             }
        });
    }
}