我(第一次)使用fancytree
。它似乎非常适合我的问题,但有一个问题我坚持下去。
我正在使用表扩展来让用户向树的节点添加其他信息。最后,我想将整个树转换为一些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-object?
如果这是不可能的,除了阅读整个tr并手工提取之外,还有另一种阅读树的方法吗?
答案 0 :(得分:1)
在遍历期间,您可以通过<tr>
访问节点node.tr
,因此您的代码可能会像这样(未经测试):
var tdList = $(">td", node.tr);
答案 1 :(得分:0)
由于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是一款非常好的软件!