无法将 Json 数组从 JSP 动态加载到 Jstree

Unable to dynamically load Json Arrays from JSP to a Jstree

我试图制作一个简单的 LDAP 客户端来仅从 LDAP 服务器检索数据。我从 JSP 返回 JSON 个对象数组。单击任何值,我将从在线服务器获取一些数据。我能够将第一组数组加载到树中。下一步得到的数组不会附加到 JSTree。我的代码:

function getGroupsStructure(id) {
console.log("in getGroupsStructure-->");
var paramId = "";

if(id == '') {
    console.log("in if-->");
    paramId = "c=de";
} else {
    console.log("in else-->");
    paramId = id;

}

  var params = {
  "DN" : paramId,

 };
  console.log("params-->",params);
   var getGroupsStructureForUserService = service(webURL + "sendingValues/getGroupsStructureForUser",params,"POST");
    getGroupsStructureForUserService.success(function(data) {
        console.log("in success-->dta-->",data);
        if(data.errorCode == '0') {
            console.log("in error code 0-->dta-->",data.treeData);
            $('.treeNode').jstree({
                'core': {
                    'data': function (obj, cb) {
                        cb.call(this,
                                data.treeData);
                }
                }
            });
            console.log("Tree Created...");
        } else {
            console.log("error code not 0--data-->",data);
        }

        $(document).off('click').on('click', '.treeNode a', function() {
            console.log("on click of a-->");
           var id = $(this).parent().attr('id');

           console.log("id-->",id);

           getGroupsStructure(id);
           console.log("after getGroupsStructure");
        });
    });
    getGroupsStructureForUserService.error(function(data) {
        console.log(" empty error");
    //    console.log(err);
    });
}

JSP代码是

def NextLevelLDAP(String DN) {
        //  println "Next Level===>"
            assert ldap!=null
            def responseArray=[]
            def results=ldap.search('objectClass=*',DN,SearchScope.ONE)         //Will be triggered when + is pressed in GUI to get next level of tree
        //  assert results==null
            if(DN.startsWith("c="))
                {
                    JSONObject responseJson1=new JSONObject()
                    responseJson1.put("id", initialDN )
                    responseJson1.put("parent", "#")
                    responseJson1.put("text","Parent")
                    responseArray.add(responseJson1)
                    for(entry in results) {
                    //  println entry
                    //  println "In NextLevel Using InitialDN"
                        JSONObject responseJson=new JSONObject()
                        responseJson.put("id", entry.dn)
                        responseJson.put("parent", DN)
                        String tempResDN=entry.dn.toString()
                        def tempLength=tempResDN.length() - DN.length()
        //              println tempResDN
                        String tempName=tempResDN.substring(2,tempLength-1)
    //                  println tempName
                        responseJson.put("text",tempName)
                        responseArray.add(responseJson)
        //              println entry
                        println responseJson.toString()
                    }
                    return responseArray
                }
            if(results.size!=0)
            {
                for(entry in results) {
                    println entry

                    JSONObject responseJson=new JSONObject()
                    responseJson.put("id", entry.dn)
                    responseJson.put("parent", DN)
                    String tempResDN=entry.dn.toString()
                    def tempLength=tempResDN.length() - DN.length()
    //              println tempResDN
                    String tempName=tempResDN.substring(2,tempLength-1)
                    println tempName
                    responseJson.put("text",tempName)
                    responseArray.add(responseJson)
    //              println entry

                }
                return responseArray
            } 
          }

请忽略获取Parent ID的方式。它有些复杂。 请帮助我如何获取动态创建的树节点。我刚刚获得树的拳头级别。其他级别的点击数据显示在控制台中,但未附加到树中。

谢谢。

你有相反的方式 - 你需要创建树并让它为你发出请求,所以不是这样:

'data': function (obj, cb) {
    cb.call(this, data.treeData);
}

使用这样的东西:

'data': function (obj, cb) {
    // you probably need to pass the obj.id as a parameter to the service
    // keep in mind if obj.id is "#" you need to return the root nodes
    service(...).success(function (data) {
        cb.call(this, data.treeData);
    });
}

这样您就不需要每次都分离和重新附加点击处理程序,它会开箱即用以打开节点。如果你想在点击时打开一个节点,你可以使用这个:

$('#tree').on('select_node.jstree', function (e, data) {
   data.instance.open_node(data.node);
});

因此您的整个代码应如下所示:

function load(id) {
    var params = {
        "DN" : id && id !== '#' ? id : "c=de"
    };
    return service(webURL + "sendingValues/getGroupsStructureForUser", params, "POST");
}

$('#tree')
    .jstree({
        'core' : {
            'data': function (obj, cb) {
                load(obj.id).success(function (data) {
                    cb.(data.treeData);
                });
            }
        }
    })
    .on('select_node.jstree', function (e, data) {
        data.instance.open_node(data.node);
    });

只需确保将 return 的节点标记为有子节点(将它们的 children 属性 设置为布尔值 true)。