Skip to content

Commit 3dd7d10

Browse files
committed
Support async loading with providing Promises or thenable functions
Other: - Support `setting.async.loadingIcon` for controlling to show or hide loading icons. - Remove `setting.async.{autoParam, otherParam, contentType, type, url, dataType, headers, xhrFields}`
1 parent dd003eb commit 3dd7d10

File tree

1 file changed

+29
-72
lines changed

1 file changed

+29
-72
lines changed

js/jquery.ztree.core.js

Lines changed: 29 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,7 +1045,6 @@
10451045
nObj.append(html.join(''));
10461046
},
10471047
asyncNode: function (setting, node, isSilent, callback) {
1048-
var i, l;
10491048
var isParent = data.nodeIsParent(setting, node);
10501049
if (node && !isParent) {
10511050
tools.apply(callback);
@@ -1058,80 +1057,38 @@
10581057
}
10591058
if (node) {
10601059
node.isAjaxing = true;
1061-
var icoObj = $$(node, consts.id.ICON, setting);
1062-
icoObj.attr({"style": "", "class": consts.className.BUTTON + " " + consts.className.ICO_LOADING});
1063-
}
1064-
1065-
var tmpParam = {};
1066-
var autoParam = tools.apply(setting.async.autoParam, [setting.treeId, node], setting.async.autoParam);
1067-
for (i = 0, l = autoParam.length; node && i < l; i++) {
1068-
var pKey = autoParam[i].split("="), spKey = pKey;
1069-
if (pKey.length > 1) {
1070-
spKey = pKey[1];
1071-
pKey = pKey[0];
1072-
}
1073-
tmpParam[spKey] = node[pKey];
1074-
}
1075-
var otherParam = tools.apply(setting.async.otherParam, [setting.treeId, node], setting.async.otherParam);
1076-
if (tools.isArray(otherParam)) {
1077-
for (i = 0, l = otherParam.length; i < l; i += 2) {
1078-
tmpParam[otherParam[i]] = otherParam[i + 1];
1079-
}
1080-
} else {
1081-
for (var p in otherParam) {
1082-
tmpParam[p] = otherParam[p];
1060+
if (setting.async.loadingIcon) {
1061+
var icoObj = $$(node, consts.id.ICON, setting);
1062+
icoObj.attr({"style": "", "class": consts.className.BUTTON + " " + consts.className.ICO_LOADING});
10831063
}
10841064
}
10851065

10861066
var _tmpV = data.getRoot(setting)._ver;
1087-
$.ajax({
1088-
contentType: setting.async.contentType,
1089-
cache: false,
1090-
type: setting.async.type,
1091-
url: tools.apply(setting.async.url, [setting.treeId, node], setting.async.url),
1092-
data: setting.async.contentType.indexOf('application/json') > -1 ? JSON.stringify(tmpParam) : tmpParam,
1093-
dataType: setting.async.dataType,
1094-
headers: setting.async.headers,
1095-
xhrFields: setting.async.xhrFields,
1096-
success: function (msg) {
1097-
if (_tmpV != data.getRoot(setting)._ver) {
1098-
return;
1099-
}
1100-
var newNodes = [];
1101-
try {
1102-
if (!msg || msg.length == 0) {
1103-
newNodes = [];
1104-
} else if (typeof msg == "string") {
1105-
newNodes = eval("(" + msg + ")");
1106-
} else {
1107-
newNodes = msg;
1108-
}
1109-
} catch (err) {
1110-
newNodes = msg;
1111-
}
1067+
setting.async.load(setting.treeId, node).then(function (newNodes) {
1068+
if (_tmpV != data.getRoot(setting)._ver) {
1069+
return;
1070+
}
11121071

1113-
if (node) {
1114-
node.isAjaxing = null;
1115-
node.zAsync = true;
1116-
}
1117-
view.setNodeLineIcos(setting, node);
1118-
if (newNodes && newNodes !== "") {
1119-
newNodes = tools.apply(setting.async.dataFilter, [setting.treeId, node, newNodes], newNodes);
1120-
view.addNodes(setting, node, -1, !!newNodes ? tools.clone(newNodes) : [], !!isSilent);
1121-
} else {
1122-
view.addNodes(setting, node, -1, [], !!isSilent);
1123-
}
1124-
setting.treeObj.trigger(consts.event.ASYNC_SUCCESS, [setting.treeId, node, msg]);
1125-
tools.apply(callback);
1126-
},
1127-
error: function (XMLHttpRequest, textStatus, errorThrown) {
1128-
if (_tmpV != data.getRoot(setting)._ver) {
1129-
return;
1130-
}
1131-
if (node) node.isAjaxing = null;
1132-
view.setNodeLineIcos(setting, node);
1133-
setting.treeObj.trigger(consts.event.ASYNC_ERROR, [setting.treeId, node, XMLHttpRequest, textStatus, errorThrown]);
1072+
if (node) {
1073+
node.isAjaxing = null;
1074+
node.zAsync = true;
1075+
}
1076+
view.setNodeLineIcos(setting, node);
1077+
if (newNodes && newNodes !== "") {
1078+
newNodes = tools.apply(setting.async.dataFilter, [setting.treeId, node, newNodes], newNodes);
1079+
view.addNodes(setting, node, -1, !!newNodes ? tools.clone(newNodes) : [], !!isSilent);
1080+
} else {
1081+
view.addNodes(setting, node, -1, [], !!isSilent);
1082+
}
1083+
setting.treeObj.trigger(consts.event.ASYNC_SUCCESS, [setting.treeId, node, newNodes]);
1084+
tools.apply(callback);
1085+
}, function (errorThrown) {
1086+
if (_tmpV != data.getRoot(setting)._ver) {
1087+
return;
11341088
}
1089+
if (node) node.isAjaxing = null;
1090+
view.setNodeLineIcos(setting, node);
1091+
setting.treeObj.trigger(consts.event.ASYNC_ERROR, [setting.treeId, node, XMLHttpRequest, textStatus, errorThrown]);
11351092
});
11361093
return true;
11371094
},
@@ -1342,7 +1299,7 @@
13421299
fontStyle.push(f, ":", fontcss[f], ";");
13431300
}
13441301
html.push("<a id='", node.tId, consts.id.A, "' class='", consts.className.LEVEL, node.level,
1345-
nodeClasses.add ? ' ' + nodeClasses.add.join(' ') : '',
1302+
nodeClasses.add ? ' ' + nodeClasses.add.join(' ') : '',
13461303
"' treeNode", consts.id.A,
13471304
node.click ? " onclick=\"" + node.click + "\"" : "",
13481305
((url != null && url.length > 0) ? " href='" + url + "'" : ""), " target='", view.makeNodeTarget(node), "' style='", fontStyle.join(''),
@@ -2006,7 +1963,7 @@
20061963
var children = data.nodeChildren(setting, root);
20071964
if (children && children.length > 0) {
20081965
view.createNodes(setting, 0, children, null, -1);
2009-
} else if (setting.async.enable && setting.async.url && setting.async.url !== '') {
1966+
} else if (setting.async.enable && setting.async.load && setting.async.load.then) {
20101967
view.asyncNode(setting);
20111968
}
20121969
return zTreeTools;
@@ -2016,4 +1973,4 @@
20161973
var zt = $.fn.zTree,
20171974
$$ = tools.$,
20181975
consts = zt.consts;
2019-
})(jQuery);
1976+
})(jQuery);

0 commit comments

Comments
 (0)