zTree樹插件動態加載

需求:

  因爲項目中家譜圖數據量超大,而通常加載方式是經過,頁面加載時 zTree.init方法進行數據加載,將全部數據一次性加載到頁面中。而在項目中家譜級別又很是廣而深,成千上萬級,所以一次加載,徹底加載不出來。因而須要進行優化爲動態加載(增量加載)的方式,以便數據加載,提升體驗度。node

解決思路:

  這應該好辦,只要找到父節點單擊事件,而後進行數據加載,結點附加便可。時間緊,任務重,徹底沒給研究的時間。只能硬着上,隨便搜索一個「zTree動態加載」,出是出來了,標題也對,可裏面的代碼根本沒找到添加結點一說……一邊是需求催,一邊是沒找到相似。無語……對啊,不是有官網,因而把全部api函數瀏覽一遍,終於發現一個叫addNodes的函數。喜!ajax

控件代碼

<div class="UserTree">
    <ul id="treeDemo" class="ztree"></ul>
</div>

腳本代碼(實現結點展開、單擊事件時進行動態加載):

<script>
    var zNodes;
    var zTree;
    $(function () {
        $.ajax({
            cache: true,
            type: "get",
            url: "/User/NextLeve",
            async: false,
            success: function (data) {
                zNodes = data;
            },
            error: function (data) {
                alert("error");
            }
        });
        zTree = ZTreeCustom.init($("#treeDemo"), setting, zNodes);
        zTree.expandAll(false);
        zTree.expandNode(zTree.getNodes()[0], true, false, true);

    })

    var setting = {
        view: {
            nameIsHTML: true
        },
        data: {
            simpleData: {
                enable: true
            },
            keep: {
                parent: true
            }
        },
        open: false,
        callback: {
            onClick: nodeClick,
            onExpand: function (event, treeId, treeNode) {
                addSubNode(treeNode);
            }
        }
    };
    function showIconForTree(treeId, treeNode) {
        return !treeNode.isParent;
    };

    function searchM() {
        var username = $("#txtName").val()

    }

    function nodeClick(event, treeId, treeNode, clickFlag) {
        addSubNode(treeNode);
    }

    function addSubNode(treeNode) {
        if (!treeNode.isParent) return;
        var s = treeNode.children;
        if (s != undefined)
            return;
        $.ajax({
            cache: true,
            type: "get",
            url: "/User/NextLeve",
            data: { userId: treeNode.id },
            async: true,
            success: function (data) {
                zTree.addNodes(treeNode, data);
            },
            error: function (data) {
                alert("error");
            }
        });

    }
</script>

其中後端請求:

  其中數據來源爲請求路徑「/User/NextLeve?userId=xxx」,爲返回以下結構的列表的json數據(即List<UserNode>類型的.ToJson()數據),其中userId可爲空,爲空時默認取當前登陸用戶:json

public class UserNode
{
    public long id { get; set; }
    public long pId { get; set; }
    public string name { get; set; }
    public bool open { get; set; }
    public bool isParent { get; set; }

    public string icon { get; set; }
}

效果,則實現爲單擊父結點/展開父結點時動態加載子結點。後端

數據查詢思路:

先查詢出一級結點內容,及其對應二級結點數:api

-- 家譜圖數據源
SELECT u.Id,u.UserName INTO #tempParent  FROM User_User AS u WHERE  u.ParentId=80 -- 父用戶id
SELECT u.Id,u.UserName,t.ChildCount FROM #tempParent u LEFT JOIN (SELECT p.Id,COUNT(1) ChildCount FROM T_User u
INNER JOIN #tempParent p ON p.Id=u.ParentId
GROUP BY p.Id
) T ON t.Id = u.Id
相關文章
相關標籤/搜索