假设我有一个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
答案 0 :(得分:2)
首先,您真正想要的是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。因此,应使用get
和set
方法通过记录/模型接口和检索集记录所有额外属性
答案 1 :(得分:0)
在最新的ExtJS版本中,树节点的NodeInterface具有执行此操作的序列化功能。也许这对你很重要。
答案 2 :(得分:0)
getTreeObjectJSONData: function (objectPanel) {
var objectStore = objectPanel.getStore(),
dataCollection = [];
if (objectStore.data.items !== undefined) {
$.each(objectStore.data.items, function (index, objectData) {
if (!objectData.data.leaf) {
dataCollection['groups'].push({
display_name: objectData.data.name,
group: objectData.data.group,
crudState: objectData.data.crudState,
unique_id: objectData.data.unique_id
});
} else {
dataCollection['fields'].push({
display_name: objectData.data.name,
group: objectData.data.group,
type: objectData.data.type != undefined ? objectData.data.type : 'null',
crudState: objectData.data.crudState,
unique_id: objectData.data.unique_id
});
}
})
}
return Ext.util.JSON.encode(dataCollection);
}
可能会有所帮助