tft*_*ftd 6 javascript jquery jstree
我试图弄清楚如何只回滚未成功移动的文件夹节点.下面的代码是我正在尝试做的一个例子.当您选择了几个文件夹并将它们移动到另一个文件夹时,就会出现问题.如果其中一个目录无法移动,我希望能够将其回滚到原始父目录.不幸的是,$.jstree.rollback(data.rlbk);将所有选中的文件夹回滚到以前的位置.
$("#tree").jstree({...}).bind("move_node.jstree", function (e, data) {
// process all selected nodes directory
data.rslt.o.each(function (i) {
// Send request.
var move = $.parseJSON($.ajax({
url: "./jstree.php",
type: 'post',
async: false,
data: {
operation: "move_dir",
....
}
}).responseText);
// When everything's ok, the reponseText will be {success: true}
// In all other cases it won't exist at all.
if(move.success == undefined){
// Here I want to rollback the CURRENT failed node.
// $.jstree.rollback(data.rlbk); will rollback all
// of the directories that have been moved.
}
}
});
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
我以前看过使用 jstree,但没有在我的代码中使用它。因此,代码可能不正确,但概念应该正确。
根据您的代码,您似乎正在服务器端执行移动操作,并且希望更新树以反映结果。
根据 jsTree 文档,您似乎无法提交节点更新并回滚到上次提交。
您可以回滚树(所有更改)并随后执行移动,而不是仅回滚您不需要的更改。
为了更好地理解下面的代码,您可能希望阅读它(或创建副本),而不需要在“if”语句的条件中设置或引用“wasTriggeredByCode”的行。
$("#tree").jstree({...}).bind("move_node.jstree", function (e, data) {
var jsTree = $(this);
var successes = [];
// Becomes true when function was triggered by code that updates jsTree to
// reflect nodes that were successfully moved on the server
var wasTriggeredByCode = false;
// process all selected nodes directory
data.rslt.o.each(function (i) {
// I'm not certain that this is how the node is referenced
var node = $(this);
wasTriggeredByCode = (wasTriggeredByCode || node.data('redoing'));
// Don't perform server changes when event was triggered from code
if (wasTriggeredByCode) {
return;
}
// Send request.
var move = $.parseJSON($.ajax({
url: "./jstree.php",
type: 'post',
async: false,
data: {
operation: "move_dir",
....
}
}).responseText);
if(move.success){
successes.push(node);
}
});
// Don't continue when event was triggered from code
if (wasTriggeredByCode) {
return;
}
// Roll back the tree here
jsTree.rollback(data.rlbk);
// Move the nodes
for (var i=0; i < successes.length; i++) {
var node = successes[i];
// According to the documentation this will trigger the move event,
// which will result in infinite recursion. To avoid this you'll need
// to set a flag or indicate that you're redoing the move.
node.data('redoing', true);
jsTree.move_node(node, ...);
// Remove the flag so that additional moves aren't ignored
node.removeData('redoing');
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3895 次 |
| 最近记录: |