从 ExtJS TreePanel 获取 JSON 数据
假设我有一个 Ext.tree.TreePanel 对象,并且它具有从外部文件加载的数据,例如:
var tree = new Ext.tree.TreePanel({
...
loader: new Ext.tree.TreeLoader({
dataUrl:'./some_file.json'
}),
...
});
该文件是定义树的对象数组。
假设用户向树添加新节点并移动一些节点。是否可以从树中获取 JSON 数据,以便用户下次加载树时使用它?
编辑(代码解决方案):
这是一个基于 Juan 回复的想法的解决方案。我将其发布,以防将来有人发现此线程并正在寻找一些代码。
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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
首先,您真正想要的是attributes 属性,它是用于创建节点的JSON。大多数相关属性都会更新,但 childNodes 不会。所以你必须写一些东西把它放回去。
通过使用 childNodes 遍历树,你可以获得所有节点。您需要将它们重新组装回单个 json。
这个示例并不完美,但足以让您入门。
更新
在 Ext-JS 4.0 中,节点现在被装饰为 记录。因此,所有额外的属性都应通过记录/模型接口进行记录,并使用
get
和set
方法检索集First of all, what you really want is the attributes property, which is the JSON used to create a node. Most relevant properties are updated, but childNodes is not. So you have to write something to put that back in.
By traversing the tree using childNodes, you can get all the nodes. You'll need to reassemble them back into a single json.
This example is not perfect, but should give you enough to get started.
Update
In Ext-JS 4.0 Nodes are now decorated into Records. Therefore, all the extra properties should be documented through the records/model interface and retrieved set using the
get
andset
methods在最新的 ExtJS 版本中,树节点的 NodeInterface 有一个序列化函数可以执行此操作。也许这与你相关。
In the latest ExtJS version the NodeInterface for Tree Nodes has an serialize function that does this. Maybe that is relevant for you.
也许会有帮助
Probably It'll be helpful