Fancytree:如何从 ext-table 获取内容
Fancytree: How to get content from ext-table
我(第一次)使用 fancytree
。它似乎很适合我的问题,但有一个问题让我卡住了。
我正在使用 table 扩展来让用户向树的节点添加附加信息。最后,我想将整棵树转换成一些 JSON 并将其发送到服务器。
到目前为止我的代码如下所示:
function readTree(tree) {
var d = tree.toDict(true, function(node){
console.log('looking at ' + node.title);
var tdList = $('tr.fancytree-active>td');
/* read the attributes */
node.attr = {
ctime : tdList.eq(2).find("input").val(),
filesize : tdList.eq(3).find("input").val(),
user : tdList.eq(4).find("input").val(),
group : tdList.eq(5).find("input").val(),
permissions : tdList.eq(6).find("input").val()
};
});
console.log(d);
}
问题是,在树遍历过程中,"fancytree-active"没有添加到当前遍历的节点。
所以我的问题可以表述为:
我如何在 toDict() 回调的上下文中访问给定节点的 html-对象?
如果这不可能,除了读取整个 tr 并手动提取外,还有其他读取树的方法吗?
在遍历期间,您可以通过 node.tr
访问节点的 <tr>
,因此您的代码可能会像这样工作(未经测试):
var tdList = $(">td", node.tr);
感谢 mar10 的回答,我找到了解决方案。
function readTree(tree) {
/* first: store all attributes in a map (accessible with the key) */
window.mapKeytoAttr = {};
tree.visit(function(node) {
var tdList = $(">td", node.tr);
attrs = {
mime : tdList.eq(1).find("input").val(),
ctime : tdList.eq(2).find("input").val(),
filesize : tdList.eq(3).find("input").val(),
user: tdList.eq(4).find("input").val(),
group: tdList.eq(5).find("input").val(),
permissions: tdList.eq(6).find("input").val()
};
window.mapKeytoAttr[node.key] = attrs;
});
/* second: use treeToDict() as before, but read attributes from the map */
var d = tree.toDict(true, function(node) {
node["attrs"] = window.mapKeytoAttr[node.key];
});
return d;
}
说明:如评论所述,在 toDict() 回调中,每个节点只有 3 个值可用:title
、key
和 folder
。但是当您使用 visit() 而不是 toDict() 时,您可以访问完整的节点对象。所以我的解决方案是,它首先在正常的树遍历期间收集所有属性,并将其存储在 mapKeytoAttr
映射中。
然后在第二个 运行 中,我使用 toDict()
从该映射中获取属性。
@mar10: fancytree 是一款非常不错的软件!
我(第一次)使用 fancytree
。它似乎很适合我的问题,但有一个问题让我卡住了。
我正在使用 table 扩展来让用户向树的节点添加附加信息。最后,我想将整棵树转换成一些 JSON 并将其发送到服务器。
到目前为止我的代码如下所示:
function readTree(tree) {
var d = tree.toDict(true, function(node){
console.log('looking at ' + node.title);
var tdList = $('tr.fancytree-active>td');
/* read the attributes */
node.attr = {
ctime : tdList.eq(2).find("input").val(),
filesize : tdList.eq(3).find("input").val(),
user : tdList.eq(4).find("input").val(),
group : tdList.eq(5).find("input").val(),
permissions : tdList.eq(6).find("input").val()
};
});
console.log(d);
}
问题是,在树遍历过程中,"fancytree-active"没有添加到当前遍历的节点。
所以我的问题可以表述为: 我如何在 toDict() 回调的上下文中访问给定节点的 html-对象?
如果这不可能,除了读取整个 tr 并手动提取外,还有其他读取树的方法吗?
在遍历期间,您可以通过 node.tr
访问节点的 <tr>
,因此您的代码可能会像这样工作(未经测试):
var tdList = $(">td", node.tr);
感谢 mar10 的回答,我找到了解决方案。
function readTree(tree) {
/* first: store all attributes in a map (accessible with the key) */
window.mapKeytoAttr = {};
tree.visit(function(node) {
var tdList = $(">td", node.tr);
attrs = {
mime : tdList.eq(1).find("input").val(),
ctime : tdList.eq(2).find("input").val(),
filesize : tdList.eq(3).find("input").val(),
user: tdList.eq(4).find("input").val(),
group: tdList.eq(5).find("input").val(),
permissions: tdList.eq(6).find("input").val()
};
window.mapKeytoAttr[node.key] = attrs;
});
/* second: use treeToDict() as before, but read attributes from the map */
var d = tree.toDict(true, function(node) {
node["attrs"] = window.mapKeytoAttr[node.key];
});
return d;
}
说明:如评论所述,在 toDict() 回调中,每个节点只有 3 个值可用:title
、key
和 folder
。但是当您使用 visit() 而不是 toDict() 时,您可以访问完整的节点对象。所以我的解决方案是,它首先在正常的树遍历期间收集所有属性,并将其存储在 mapKeytoAttr
映射中。
然后在第二个 运行 中,我使用 toDict()
从该映射中获取属性。
@mar10: fancytree 是一款非常不错的软件!