Tabulator - 在任何层级添加 TREE 项
Tabulator - Adding TREE items at any hierachical level
在制表符 documentation/examples 中没有找到任何方法来做到这一点,我已经搜索了一段时间如何做这个非常基本的事情。
我看过这个 answer 但它依赖于 JQuery 我不知道而且我不能在我有限的环境中使用(另外,它似乎没有解决错位的 TREE分支和 [+]/[-] 树按钮)。
下面是我的(故障)纯 JS 代码,我希望它能正确执行:当您单击现有的 TREE 项目(但 TREE 附件、缩进和 [ +]/[-] 按钮发疯)。
据我所知,alert()
显示的结果是正确的。
这可能是 Tabulator 库错误吗?
<!DOCTYPE html>
<html lang="en">
<head><title>Tree</title>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://unpkg.com/tabulator-tables@4.5.0/dist/css/tabulator.min.css" rel="stylesheet">
<script type="text/javascript" src="https://unpkg.com/tabulator-tables@4.5.0/dist/js/tabulator.min.js"></script>
<style>
body{margin:1.5%}
#treediv{width:300px;height:250px;font-size:1.6em;background:#777};
</style>
<script type="text/javascript">
function $def(variable) {return(typeof variable !== 'undefined')}
var count = 0; // item #
window.onload=function()
{
var treedata =
[ {name:"Bob"}, {name:"Tom"},
{name:"Jane", _children:[{name:"Eric"}]},
{name:"John", _children:[{name:"Lin", _children:[{name:"Eva"}]}]}
];
var tree = new Tabulator("#tree",
{ height:"250px", layout:"fitColumns", headerVisible:false,
data:treedata, dataTree:true, dataTreeChildIndent:25,
dataTreeStartExpanded:true, selectable:1,
columns: [ {field:'name'} ],
rowClick:function(e, row)
{
var children = row.getData()["_children"];
var nbr = $def(children) ? children.length : 0;
count++;
row.select();
var selectedRows = tree.getSelectedRows();
var root = selectedRows[0].getTreeParent();
if(root)
{ var r = root; parents = 1;
while(r){r = r.getTreeParent(); if(r){root = r}}
} else root = selectedRows[0];
if(!nbr) // easy case, define _children[]
{
row.update({_children:[{name:"pNEW" + count}]});
alert(JSON.stringify(root.getData()));
}
else // _children[] already exists, add NEW ITEM
{
children.push({name:"cNEW" + count});
row.update({_children:children});
alert(JSON.stringify(root.getData()));
}
},
});
}
</script>
</head><body>
<div id="treediv"> <div id="tree"></div> </div>
</body></html>
由于 JSON 数组已正确更新 - 但渲染不佳,(丑陋的)解决方法只是在 rowClick:function(e, row){}
的末尾添加以下代码行:
rowClick:function(e, row){
...
tree.setData(tree.getData()); // make tree use new JSON array
}
然后有人提出了(可能)更好的 API 调用:
rowClick:function(e, row){
...
tree.redraw(true); // make tree use new JSON array
}
然而,它根本没有解决问题:tree.redraw()
有问题,可能是问题的根源。
使用我的变通方法,Tabulator 库正确地呈现了 TREE(证明我们的点击代码正在运行并且这是一个 Tabulator 错误)。
这可以安全地用作未来安全的变通方法(也就是说,如果您的 TREE 不是太大并且减慢强制刷新...)直到 Tabulator 库被修复。
在制表符 documentation/examples 中没有找到任何方法来做到这一点,我已经搜索了一段时间如何做这个非常基本的事情。
我看过这个 answer 但它依赖于 JQuery 我不知道而且我不能在我有限的环境中使用(另外,它似乎没有解决错位的 TREE分支和 [+]/[-] 树按钮)。
下面是我的(故障)纯 JS 代码,我希望它能正确执行:当您单击现有的 TREE 项目(但 TREE 附件、缩进和 [ +]/[-] 按钮发疯)。
据我所知,alert()
显示的结果是正确的。
这可能是 Tabulator 库错误吗?
<!DOCTYPE html>
<html lang="en">
<head><title>Tree</title>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://unpkg.com/tabulator-tables@4.5.0/dist/css/tabulator.min.css" rel="stylesheet">
<script type="text/javascript" src="https://unpkg.com/tabulator-tables@4.5.0/dist/js/tabulator.min.js"></script>
<style>
body{margin:1.5%}
#treediv{width:300px;height:250px;font-size:1.6em;background:#777};
</style>
<script type="text/javascript">
function $def(variable) {return(typeof variable !== 'undefined')}
var count = 0; // item #
window.onload=function()
{
var treedata =
[ {name:"Bob"}, {name:"Tom"},
{name:"Jane", _children:[{name:"Eric"}]},
{name:"John", _children:[{name:"Lin", _children:[{name:"Eva"}]}]}
];
var tree = new Tabulator("#tree",
{ height:"250px", layout:"fitColumns", headerVisible:false,
data:treedata, dataTree:true, dataTreeChildIndent:25,
dataTreeStartExpanded:true, selectable:1,
columns: [ {field:'name'} ],
rowClick:function(e, row)
{
var children = row.getData()["_children"];
var nbr = $def(children) ? children.length : 0;
count++;
row.select();
var selectedRows = tree.getSelectedRows();
var root = selectedRows[0].getTreeParent();
if(root)
{ var r = root; parents = 1;
while(r){r = r.getTreeParent(); if(r){root = r}}
} else root = selectedRows[0];
if(!nbr) // easy case, define _children[]
{
row.update({_children:[{name:"pNEW" + count}]});
alert(JSON.stringify(root.getData()));
}
else // _children[] already exists, add NEW ITEM
{
children.push({name:"cNEW" + count});
row.update({_children:children});
alert(JSON.stringify(root.getData()));
}
},
});
}
</script>
</head><body>
<div id="treediv"> <div id="tree"></div> </div>
</body></html>
由于 JSON 数组已正确更新 - 但渲染不佳,(丑陋的)解决方法只是在 rowClick:function(e, row){}
的末尾添加以下代码行:
rowClick:function(e, row){
...
tree.setData(tree.getData()); // make tree use new JSON array
}
然后有人提出了(可能)更好的 API 调用:
rowClick:function(e, row){
...
tree.redraw(true); // make tree use new JSON array
}
然而,它根本没有解决问题:tree.redraw()
有问题,可能是问题的根源。
使用我的变通方法,Tabulator 库正确地呈现了 TREE(证明我们的点击代码正在运行并且这是一个 Tabulator 错误)。
这可以安全地用作未来安全的变通方法(也就是说,如果您的 TREE 不是太大并且减慢强制刷新...)直到 Tabulator 库被修复。