2010-12-08 5 views
1

Допустим, у меня есть объект Ext.tree.TreePanel, и это данные загружаются из внешнего файла, например:Получить JSON данных с ExtJS TreePanel

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

Прежде всего, то, что вы действительно хотите, это свойство атрибутов, которое является 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(); 

Этот пример не идеален, но должен дать вам достаточно, чтобы начать.

Update

В Ext JS-4.0 Узлов теперь обрамлены в Records. Поэтому все дополнительные свойства должны быть задокументированы через интерфейс записей/модели и извлечены с использованием методов get и set

+0

Я не знал об атрибуте property. Это и массив childNodes - это то, что мне нужно. Благодарю вас за информацию! – patorjk 2010-12-08 23:03:11

0

В последней версии ExtJS NodeInterface для узлов дерева имеет функцию сериализации, которая делает это. Возможно, это актуально для вас.