树形菜单 jsTree 使用方法

jsTree版本:3.0.4

在ASP.NET MVC中使用jsTree

Model:

    public class Department
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int PId { get; set; }
    }

数据库:

Controller:

jsTree既可以一次性把所有节点都加载到客户端,也可以只加载一层,点击节点后再去服务端获取下层节点。对于小的菜单可以一次性加载完,如果节点很多,可以按需加载(lazy loading)。

1、 一次性加载完所有节点

public JsonResult GetTreeData(int clickId = 0)
{
    // use database
    var db=new Salary.Models.EntityContext();

    /* 一次性加载完所有节点.
     * 前端只需配置 ‘data‘: {
                ‘url‘: ‘/Home/GetTreeData‘,
                ‘dataType‘: ‘json‘
     * } 不用给服务端传值
     * 服务端不需写where
    */
    var items=from item in db.Department
              select new
              {
                  id = item.Id,
                  parent = item.PId.ToString() == "0" ? "#" : item.PId.ToString(), // root必须是# !
                  text = item.Name
              };

    return Json(items, JsonRequestBehavior.AllowGet);
}

2、按需加载节点(lazy loading)

public JsonResult GetTreeData(int clickId = 0)
{
    // use database
    var db=new Salary.Models.EntityContext();

    /* 异步加载节点(按需)
        前端需提供id传给服务端:
        ‘data‘: function (node) {
                    return { id: node.id };
        }
       后端要在linq中加where筛选
    */
    var items=from item in db.Department
              where item.PId == clickId     // 在服务端要把所有上级节点找出来
              select new                    // 匿名类可以添加需要的字段,比如HasChildren
              {
                  id = item.Id,
                  parent = item.PId.ToString() == "0" ? "#" : item.PId.ToString(), // root必须是# !
                  text = item.Name,
                  children = db.Department.Any(p => p.PId == item.Id) // true|false 是否有子项

              };

    return Json(items, JsonRequestBehavior.AllowGet);
}

View:

<div id="jstree">

@section scripts{
<link href="~/Content/jstree/themes/default/style.min.css" rel="stylesheet" />
<script src="~/Scripts/jstree/jstree.js"></script>
<script>
        $(document).ready(function () {
          $("#jstree").jstree({
                "core": {
                   //‘initially_open‘:["abc"],
                    ‘data‘: {
                        ‘url‘: ‘/Home/GetTreeData‘,
                        ‘dataType‘: ‘json‘,
                        ‘data‘: function (node) { // 传给服务端点击的节点
                            //return { id: node.id == "#" ? "0" : node.id };
                            return { clickId: node.id };
                        },
                        success: function () {
                            //alert(‘ok‘);
                        }
                    }
                }
            });

             // 展开节点
            $("#jstree").on("loaded.jstree", function (event, data) {
                // 展开所有节点
                //$(‘#jstree‘).jstree(‘open_all‘);
                // 展开指定节点
                //data.instance.open_node(1);     // 单个节点 (1 是顶层的id)
                data.instance.open_node([1, 10]); // 多个节点 (展开多个几点只有在一次性装载后所有节点后才可行)
            });

            // 所有节点都加载完后
            $("#jstree").on("ready.jstree", function (event, data) {
                //alert(‘all ok‘);
                data.instance.open_node(1); // 展开root节点
                //// 隐藏根节点 http://stackoverflow.com/questions/10429876/how-to-hide-root-node-from-jstree
                $("#1_anchor").css("visibility", "hidden");
                $("li#1").css("position", "relative")
                $("li#1").css("top", "-20px")
                $("li#1").css("left", "-20px")
                $(".jstree-last .jstree-icon").first().hide();
            });

            // 获得点击节点的id
            $(‘#jstree‘).on("changed.jstree", function (e, data) {
                console.log("The selected nodes are:");
                console.log(data.selected);
                alert(‘node.id is:‘ + data.node.id);
                alert(‘node.text is:‘+data.node.text);
                console.log(data);

                // TODO: 传递给Tab
                //$.ajax({
                //    ‘url‘: ‘Home/GetTreeData/‘,
                //    ‘data‘: { ‘id‘: data.node.id }
                //});
            });
        });// end ready
</script>

根节点的父项是0,根节点只有一个,似乎显示出来也不好看:

所以我们把它隐藏起来:

PS:

ready 和loaded  的区别:
loaded.jstree: triggered after the root node is loaded for the first time
ready.jstree : triggered after all nodes are finished loading

参考:

https://github.com/vakata/jstree

https://groups.google.com/forum/#!forum/jstree

http://www.jstree.com/

http://www.codeproject.com/Questions/731612/jstree-binding-with-json-data-send-from-controller

--End--

时间: 2024-12-19 18:12:13

树形菜单 jsTree 使用方法的相关文章

利用多叉树实现Ext JS中的无限级树形菜单(一种构建多级有序树形结构JSON的方法)

一.问题研究的背景和意义 目前在Web应用程序开发领域,Ext JS框架已经逐渐被广泛使用,它是富客户端开发中出类拔萃的框架之一.在Ext的UI控件中,树形控件无疑是最为常用的控件之一,它用来实现树形结构的菜单.TreeNode用来实现静态的树形菜单,AsyncTreeNode用来实现动态的异步加载树形菜单,后者最为常用,它通过接收服务器端返回来的JSON格式的数据,动态生成树形菜单节点.动态生成树有两种思路:一种是一次性生成全部树节点,另一种是逐级加载树节点(利用AJAX,每次点击节点时查询下

jsTree树形菜单分类

这里我演示的jsTree是基于ABP框架 ,展示部分代码,话不多说首先看效果如: 1:引入JS <link href="/jstree/themes/default/style.css" rel="stylesheet" /> <script src="/jstree/jstree.js"></script> 2:页面部分代码 1 <div class="row"> 2 <

Jquery Easy-UI 树形菜单的运用

一.树形菜单的右键标签 期中增加同级机构.增加下属机构.修改.删除分别是调用了addNode(),del()等方法. <div id="menuTree" class="easyui-menu" style="width: 120px;"> <SecurityTag:Authorize ID="Authorize12" runat="server" FunctionID="fun

用dtree实现树形菜单 dtree使用说明

http://www.jb51.net/article/28566.htm 准备工作: 请从脚本之家http://www.jb51.net/jiaoben/31974.html下载dtree.zip文件 dtree.zip压缩包介绍: dtree是一个由JavaScript编写成的简单的树形菜单组件,目前免费并且开源. 目前有很多的树形菜单组件(比如ext),dtree是一种简单易懂的js组件, 不需要复杂的操作即可生产,同时支持动态从数据库引入数据 解压后有以下几部分: img文件夹: 包含树

实用的树形菜单控件tree

 jQuery plugin: Treeview 这个插件能够把无序列表转换成可展开与收缩的Tree. jQuery plugin: Treeview  jQuery  jstree jsTree是一个基于jQuery的Tree控件.支持XML,JSON,Html三种数据源.提供创建,重命名,移动,删除,拖\放节点操作.可以自己自定义创建,删除,嵌套,重命名,选择节点的规则.在这些操作上可以添加多种监听事件.  jstree  jQuery UI Widgets  FileTreePanel F

使用jquery实现的多级树形菜单代码实例

使用jquery实现的多级树形菜单代码实例:树形菜单在网站中有大量的应用,这当然是因为它的独特优点,首先它可以有效的组织数据,使分类更为清晰明了,通常情况下树形菜单是可以折叠的,这样可以以更小的空间容纳更多的数据,下面就详细介绍一个使用jquery实现的属性菜单.代码实例如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author&q

Unity UGUI自定义树形菜单(TreeView)

先上几张效果图:          如果你需要的也是这种效果,那你就来对地方了! 目前,我们这个树形菜单展现出来的功能如下: 1.可以动态配置数据源: 2.点击每个元素的上下文菜单按钮(也就是图中的三角形按钮),可以收缩或展开它的子元素: 3.可以单独判断某一元素的复选框是否被勾选,或者直接获取当前树形菜单中所有被勾选的元素: 4.树形菜单统一控制其下所有子元素按钮的事件分发: 5.可自动调节的滚动视野边缘,根据当前可见的子元素数量进行横向以及纵向的伸缩: 一.首先,我们先制作子元素的模板(Te

简单实用的二级树形菜单hovertree

原创,欢迎评论推荐. hovertree是一个仿京东的树形菜单jquery插件,暂时有银色和绿色两种. 官方网址:http://keleyi.com/jq/hovertree/欢迎下载使用 查看绿色效果:http://keleyi.com/jq/hovertree/hovertreegreen.htm 可以设置菜单宽度(width),还可以设置是否最多只能有一个一级菜单展开(isCloseOther). isCloseOther的值为false 或者 true,设为true即成为手风琴菜单. 使

Java构建树形菜单

构建树形菜单 效果图:支持多级菜单. 菜单实体类: public class Menu { // 菜单id private String id; // 菜单名称 private String name; // 父菜单id private String parentId; // 菜单url private String url; // 菜单图标 private String icon; // 菜单顺序 private int order; // 子菜单 private List<Menu> ch