2010-12-08 9 views
1

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 

Antwort

1

Zuerst, was Sie wirklich wollen, ist die Eigenschaft Attribute, die die JSON ist, die zum Erstellen eines Knotens verwendet wird. Die meisten relevanten Eigenschaften werden aktualisiert, childNodes jedoch nicht. Sie müssen also etwas schreiben, um das wieder einzufügen.

Durch die Baumstruktur mit childNodes können Sie alle Knoten erhalten. Sie müssen sie wieder in einem einzigen JSON zusammensetzen.

Dieses Beispiel ist nicht perfekt, aber sollte Ihnen genug geben, um zu beginnen.

aktualisieren

In Ext-JS 4.0 Knoten werden nun in Records eingerichtet. Daher werden alle zusätzlichen Eigenschaften sollten durch die Aufzeichnungen/Modell-Schnittstelle zu dokumentieren und die abgerufene get und set Methoden

+0

Ich wusste nicht über die Eigenschaft Attribut. Das und das childNodes-Array sind genau das, was ich brauchte. Danke für die Info! – patorjk

+0

Attribute sind jetzt Daten – Stevanicus

+0

@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 –

0

In der neuesten Version ExtJS die NodeInterface für Strukturknoten hat eine serialize Funktion gesetzt verwenden, das dies tut. Vielleicht ist das relevant für dich.