2017-03-01 81 views
0

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

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

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

线沿线的东西:

"contextmenu": { 
    "select_node": false, 
    "show_at_node": false, 
    "items": function(node) { 
     $.ajax({ 
      url: 'some_url_with_actions_for_node', 
      success: function (action_list) { 
       return action_list; 
      } 
     }) 
    } 
} 

显然上面的例子就不会工作,但你的想法。

的文件说,该菜单可以

接受一个节点,一个回调函数,并与该节点 可用操作的对象调用 回调函数(你也可以返回一个函数物品也)

所以也许有一种方法来挤压我需要的回调?我对JS很难弄清楚。

回答

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); 
    }); 

} 
-2

我有完全一样的问题,你可以找到解决方案here

你只需要做:

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

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

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

虽然此链接可以回答这个问题,最好是在这里有答案的主要部件,并提供链接以供参考。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/16993956) –

+0

好的,这就是为什么我的答案被投票。我是新来的,我没有阅读文档。 – vnea