Получите данные JSON из ExtJS TreePanel - PullRequest
2 голосов
/ 08 декабря 2010

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

var tree = new Ext.tree.TreePanel({
    ...
    loader: new Ext.tree.TreeLoader({
        dataUrl:'./some_file.json'
    }),
    ...
});

Этот файл представляет собой массив объектов, которые определяют дерево.

Допустим, пользователь добавляет новые узлы в дерево и перемещает некоторые узлы. Можно ли получить данные JSON из дерева, чтобы их можно было использовать в следующий раз, когда пользователь загрузит дерево?

РЕДАКТИРОВАТЬ (решение кода) :

Вот решение, основанное на идеях из ответа Хуана. Я поднимаю это на тот случай, если кто-нибудь найдет эту ветку в будущем и ищет какой-то код.

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

Ответы [ 3 ]

2 голосов
/ 09 декабря 2010

Прежде всего, что вам действительно нужно, так это свойство attribute, которое представляет собой 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 узлы теперь оформлены в Записи .Поэтому все дополнительные свойства должны быть задокументированы через интерфейс записей / моделей и извлечены из набора с использованием методов get и set

.
0 голосов
/ 12 апреля 2018
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);
}

Возможно, это будет полезно

0 голосов
/ 13 ноября 2013

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

...