Нужна копия магазина дерева

ExtJS4

Я создал TreePanel как

var tree = Ext.create('Ext.tree.TreePanel', <some config>);
tree.store.setRootNode(treeJSON);

Теперь я хочу создать другое дерево с теми же данными хранилища, но с другими объектами хранилища. Если я сделаю это:

var tree1 = tree.cloneConfig(<separate listeners>);

Затем он создает другое дерево. Но все же оба связаны. Когда я сворачиваю или расширяю один узел дерева, соответствующий узел в другом дереве также ведет себя аналогично.

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

var store2 = Ext.create('Ext.data.TreeStore', {store: treeJSON});
var tree1 = tree.cloneConfig({store: store2});

Я думал, что store2 будет отличаться от магазина trees. Но проблема была там, так как я использовал тот же treeJSON.

Одна вещь, которую я могу сделать, это преобразовать JSON в строку, декодировать ее, чтобы создать другой объект JSON и назначить его новому хранилищу. Это будет отличаться от предыдущего магазина. Но для этого должен существовать быстрый способ.

Как создать дубликат дерева с разными объектами хранилища, чтобы при развертывании/сворачивании одного узла в дереве он не разворачивался/сворачивался таким же образом в другом?


person Shashwat    schedule 30.07.2012    source источник


Ответы (2)


Ext.data.NodeInterface имеет метод "copy" с параметром "deep", но до ExtJs 4.1.3 глубокое клонирование не работает. Подробнее: просто забыли передать параметр "id" при вызове childNode.clone.

Для людей, все еще использующих ExtJS ‹ 4.1.3, используйте это для глубокого клонирования деревьев:

/**
 * Because of a bug in Ext.data.NoteInterface in ExtJs < 4.1.3
 * we have to do deep cloning.
 */
var clone = function(node) {
  var result = node.copy(),
      len = node.childNodes ? node.childNodes.length : 0,
      i;
  // Move child nodes across to the copy if required
  for (i = 0; i < len; i++)
    result.appendChild(clone(node.childNodes[i]));
  return result;
};

var oldRoot = store1.getRootNode(),
    newRoot = clone(oldRoot);

store2.setRootNode(newRoot);
person Eric Winter    schedule 06.07.2013

Я сделал что-то подобное этому.

Разберите свое старое дерево, чтобы создать новое дерево

var root = existingTree.getRootNode ();
if (root) {
  var rootNode = this.getClonedTreeRoot(root);
  newTree.store.setRootNode (rootNode);
}


getClonedTreeRoot: function (node) {

  var me = this;
  var rootData;
  var childData = [];

  if (node.hasChildNodes ()) {
    var childNodes = node.childNodes;
    Ext.Array.each (childNodes, function (child) {
       if (child.get ('checked')) {
    childData.push (me.getClonedTreeRoot(child));           
       }        
    });
  }

  if (node.isLeaf ()) {
    rootData = {
        "text" : node.get ('text'),
        "leaf" : true,
        "expanded" : false,
        "children" : childData
    };
  } else {
    rootData = {
        "text" : node.get ('text'),
        "leaf" : false,
        "expanded" : true,
        "children" : childData
     };
   }

   return rootData;
}
person sharathchandra.ck    schedule 07.08.2012
comment
Лучше, если у нас есть какая-то встроенная функция - person Shashwat; 14.08.2012