为什么不在 jstree 中加载 ajax 请求返回的数据
why not load returned data from ajax request in jstree
我在 jstree 中发出 ajax 请求,我在成功方法中看到 returned 数据和 return 这个数据..但是树仍然是空的。
img:
Jstree:
$('#tree_2').jstree({
'plugins': ["checkbox" ,"ui"],
'core' : {
'data' : {
"url" : "../../Controller/ActiveDirectoryController.php5?"+datas,
"data" : function (node) {
debugger
return { "id" : node.id };
},
"success": function(result_){
result = JSON.parse(result_);
debugger
return [result.Objects];
}
}
}
});
php:
if(in_array("user",$aDobjects[$i]["objectclass"]))
{
$result[] = array("id"=>$i+1,"text"=>$aDobjects[$i]["name"][0],"children"=>false,"parent"=>"-2", "distinguishedName"=>$aDobjects[$i]["distinguishedname"][0]);
}
else
{
$result[] = array("id"=>$i+1,"text"=>$aDobjects[$i]["name"][0],"children"=>true,"parent"=>"-2", "distinguishedName"=>$aDobjects[$i]["distinguishedname"][0]);
}
}
您在 success
中执行的代码不会影响 jstree 接收的数据。所以基本上 jstree 获取的数据是您的服务器 returns,而不是您在 success
回调中修改的 object。
确保您的服务器响应采用所需的 jsTree 格式。如果您无法匹配格式,请查看 jQuery ajax dataFilter
选项。
提供适当的 headers:
也是一个好主意
header('Content-Type: application/json; charset=utf-8');
这样客户端就会知道您的响应实际上是 JSON。
我使用 jstree 事件,在其中绑定 post 函数还检查数据(停止同一节点 post)并通过响应刷新树,这里是我解决问题的方法:
var slctedText ="";
$('#tree_2').jstree({
'plugins': ["types","json_data" ,"ui"],
'core': {
"themes" : {
"responsive": false,
"icons":false
},
'data': [{}]
},
"types" : {
"default" : {
"icon" : "fa fa-folder icon-state-warning icon-lg"
},
"file" : {
"icon" : "fa fa-file icon-state-warning icon-lg"
}
}
}).bind('before_open.jstree', function (e, data) {
e.stopPropagation()
setUpButtons();
if( data.node.text.indexOf("DC=")>-1)//!passOpen ||
return;
if(data.node.text == slctedText)
return;
debugger
keyValuePair = []
slctedText = data.node.text;
var objParam = data.node.original.subtext;//prepareParam(slctedText, data.node.parents);
var params = {
action: "getSubAdObjects",
objectParam: objParam,
serverIP: serverip,
port: port,
domain: domain,
username: username,
password: password
}
$.ajax({
url: "../../Controller/ActiveDirectoryController.php5",
type: "POST",
async:false,
dataType: "json",
data: params,
success: function (result) {
passOpen = false;
if(result.Objects.length>0)
{
treeData_ = prepareObjectsforTree(result.Objects);
resfreshJSTree(treeData_);
debugger
}
$("#mdlObjects").modal("show");
$("#divfailed").hide();
event.theme ='lime';
event.heading ='<i class=\'fa fa-check\'></i> Process Completed';
event.message ='Active Directory objects retrieved successfully.';
ntf(event);
},
error: function (a, b, c) {
}
})
})
并且此服务器函数 return 来自服务器的响应数据:
public function parseADobjectsForTree($aDobjects){
try
{
$result = array();
$singleObject = array();
unset($aDobjects["count"]);
for($i=0; $i < count($aDobjects); $i++)
{
if(array_key_exists("name", $aDobjects[$i]))
{
if(in_array("user",$aDobjects[$i]["objectclass"]))
{
$result[] = array("id"=>$i+1, "text"=>$aDobjects[$i]["name"][0],"subtext"=>$aDobjects[$i]["distinguishedname"][0] );//"li_attr"=>"jstree-leaf"
}
else
{
$result[] = array("id"=>$i+1, "text"=>$aDobjects[$i]["name"][0], "subtext"=>$aDobjects[$i]["distinguishedname"][0],"children"=> array());//"li_attr"=>"jstree-closed",
}
}
}
我在 jstree 中发出 ajax 请求,我在成功方法中看到 returned 数据和 return 这个数据..但是树仍然是空的。
img:
Jstree:
$('#tree_2').jstree({
'plugins': ["checkbox" ,"ui"],
'core' : {
'data' : {
"url" : "../../Controller/ActiveDirectoryController.php5?"+datas,
"data" : function (node) {
debugger
return { "id" : node.id };
},
"success": function(result_){
result = JSON.parse(result_);
debugger
return [result.Objects];
}
}
}
});
php:
if(in_array("user",$aDobjects[$i]["objectclass"]))
{
$result[] = array("id"=>$i+1,"text"=>$aDobjects[$i]["name"][0],"children"=>false,"parent"=>"-2", "distinguishedName"=>$aDobjects[$i]["distinguishedname"][0]);
}
else
{
$result[] = array("id"=>$i+1,"text"=>$aDobjects[$i]["name"][0],"children"=>true,"parent"=>"-2", "distinguishedName"=>$aDobjects[$i]["distinguishedname"][0]);
}
}
您在 success
中执行的代码不会影响 jstree 接收的数据。所以基本上 jstree 获取的数据是您的服务器 returns,而不是您在 success
回调中修改的 object。
确保您的服务器响应采用所需的 jsTree 格式。如果您无法匹配格式,请查看 jQuery ajax dataFilter
选项。
提供适当的 headers:
也是一个好主意header('Content-Type: application/json; charset=utf-8');
这样客户端就会知道您的响应实际上是 JSON。
我使用 jstree 事件,在其中绑定 post 函数还检查数据(停止同一节点 post)并通过响应刷新树,这里是我解决问题的方法:
var slctedText ="";
$('#tree_2').jstree({
'plugins': ["types","json_data" ,"ui"],
'core': {
"themes" : {
"responsive": false,
"icons":false
},
'data': [{}]
},
"types" : {
"default" : {
"icon" : "fa fa-folder icon-state-warning icon-lg"
},
"file" : {
"icon" : "fa fa-file icon-state-warning icon-lg"
}
}
}).bind('before_open.jstree', function (e, data) {
e.stopPropagation()
setUpButtons();
if( data.node.text.indexOf("DC=")>-1)//!passOpen ||
return;
if(data.node.text == slctedText)
return;
debugger
keyValuePair = []
slctedText = data.node.text;
var objParam = data.node.original.subtext;//prepareParam(slctedText, data.node.parents);
var params = {
action: "getSubAdObjects",
objectParam: objParam,
serverIP: serverip,
port: port,
domain: domain,
username: username,
password: password
}
$.ajax({
url: "../../Controller/ActiveDirectoryController.php5",
type: "POST",
async:false,
dataType: "json",
data: params,
success: function (result) {
passOpen = false;
if(result.Objects.length>0)
{
treeData_ = prepareObjectsforTree(result.Objects);
resfreshJSTree(treeData_);
debugger
}
$("#mdlObjects").modal("show");
$("#divfailed").hide();
event.theme ='lime';
event.heading ='<i class=\'fa fa-check\'></i> Process Completed';
event.message ='Active Directory objects retrieved successfully.';
ntf(event);
},
error: function (a, b, c) {
}
})
})
并且此服务器函数 return 来自服务器的响应数据:
public function parseADobjectsForTree($aDobjects){
try
{
$result = array();
$singleObject = array();
unset($aDobjects["count"]);
for($i=0; $i < count($aDobjects); $i++)
{
if(array_key_exists("name", $aDobjects[$i]))
{
if(in_array("user",$aDobjects[$i]["objectclass"]))
{
$result[] = array("id"=>$i+1, "text"=>$aDobjects[$i]["name"][0],"subtext"=>$aDobjects[$i]["distinguishedname"][0] );//"li_attr"=>"jstree-leaf"
}
else
{
$result[] = array("id"=>$i+1, "text"=>$aDobjects[$i]["name"][0], "subtext"=>$aDobjects[$i]["distinguishedname"][0],"children"=> array());//"li_attr"=>"jstree-closed",
}
}
}