2010-12-08 134 views
1

可以说我有一个Ext.tree.TreePanel对象,它已经从外部文件加载的数据,例如:获取JSON数据

var tree = new Ext.tree.TreePanel({ 
    ... 
    loader: new Ext.tree.TreeLoader({ 
     dataUrl:'./some_file.json' 
    }), 
    ... 
}); 

此文件是定义对象数组树。

假设用户向树添加新节点并移动一些节点。是否需要从树中获取JSON数据,以便下次用户加载树时使用它?

EDIT(代码解决方案)

这是基于从娟的反应想法的解决方案。我正在把这件事情在任何人发现这个线程在未来,并正在寻找一些代码。

function getNodeList(bfsQueue) { 
    var node = bfsQueue.pop(); 
    var nodeQueue = []; 

    for (var ii = 0; ii < node.childNodes.length; ii++) { 
     bfsQueue.push(node.childNodes[ii]); 
     nodeQueue.push(node.childNodes[ii]); 
    } 
    if (bfsQueue.length === 0) { 
     return nodeQueue; 
    } else { 
     return nodeQueue.concat(getNodeList(bfsQueue)); 
    } 
} 

var startQueue = []; 
var nodeList = []; 

startQueue.push(tree.getRootNode()); 
nodeList.push(tree.getRootNode()); 
nodeList = nodeList.concat(getNodeList(startQueue)); 
console.dir(nodeList); 

for (var nn = nodeList.length-1; nn >= 0; nn--) { 

    var params = []; 
    for (var pp in nodeList[nn].attributes) { 
     if (pp === "children" || pp === "loader") {continue;} 
     params.push('"' + pp + '":' + JSON.stringify(nodeList[nn].attributes[pp]) + ''); 
    } 

    if (nodeList[nn].childNodes.length > 0) { 
     var childList = []; 

     for (var ii = 0; ii < nodeList[nn].childNodes.length; ii++) { 
      childList.push(nodeList[nn].childNodes[ii].json); 
     } 

     params.push('"children": [' + childList.join(',') + ']'); 
    } 

    nodeList[nn].json = "{" + params.join(",") + "}"; 
} 

console.log(nodeList[0].json); // root node 

回答

1

首先,你真正想要的是attributes属性,它是用来创建节点的JSON。最相关的属性会更新,但childNodes不是。所以你必须写点东西让它回来。

通过使用childNodes遍历树,你可以获得所有的节点。你需要将它们重新组装成一个单一的JSON。

Ext.data.Node.prototype.getJson = function() { 
     // Should deep copy so we don't affect the tree 
     var json = this.attributes; 

     json.children = []; 
     for (var i=0; i < node.childNodes.length; i++) { 
      json.children.push(node.childNodes[i].getJson()) 
     } 
     return json; 
} 

tree.getRootNode().getJson(); 

这个例子并不完美,但应该给你足够的开始。

更新

在EXT-JS 4.0节点现在都装修成Records。因此,应通过记录/模型接口记录所有额外属性,并使用getset方法检索集

+0

我不知道属性属性。那和childNodes数组正是我所需要的。谢谢你的信息! – patorjk 2010-12-08 23:03:11

0

在最新的ExtJS版本中,树节点的NodeInterface具有这样的序列化函数。也许这与你有关。