sagen Lets ich ein Ext.tree.TreePanel Objekt, und es Daten aus einer externen Datei geladen wird, ab:Get JSON Daten von ExtJS TreePanel
var tree = new Ext.tree.TreePanel({
...
loader: new Ext.tree.TreeLoader({
dataUrl:'./some_file.json'
}),
...
});
Diese Datei ist ein Array von Objekten, die die definieren Baum.
Nehmen wir an, der Benutzer fügt neue Knoten zum Baum hinzu und verschiebt einige Knoten um. Ist es weg, um die JSON-Daten aus der Baumstruktur zu holen, damit sie beim nächsten Laden des Baums verwendet werden können?
EDIT (Code-Lösung):
Hier ist eine Lösung auf Ideen von Juan Reaktion basiert. Ich stelle das auf, für den Fall, dass jemand diesen Thread in der Zukunft findet und nach Code sucht.
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
Ich wusste nicht über die Eigenschaft Attribut. Das und das childNodes-Array sind genau das, was ich brauchte. Danke für die Info! – patorjk
Attribute sind jetzt Daten – Stevanicus
@Stevanicus Danke für das Ext-JS 4.0 Update. Beachten Sie, dass Sie lieber eine Modelldefinition und die Schnittstelle "get/set" festlegen sollten, anstatt direkt auf die Eigenschaft ".data" zuzugreifen, damit Sie nicht mit undokumentierten Eigenschaften arbeiten –