ListLoader = function(config){ Ext.apply(this, config); }; Ext.extend(ListLoader, Ext.util.Observable, { keyAttribute: 'id', keyField: 'parentId', load: function(node, callback){ var key = this.keyField; var v = node.attributes[this.keyAttribute]; var rs = this.store.queryBy(function(r){ return r.data[key] === v; }); node.beginUpdate(); for (var i = 0, d = rs.items, len = d.length; i < len; i++) { var n = this.createNode(d[i]); if (n) { node.appendChild(n); } } node.endUpdate(); if(typeof callback == "function"){ callback(this, node); } }, createNode : function(record){ var d = record.data, n; if(d.isFolder){ n = new Ext.tree.AsyncTreeNode({ loader: this, id: record.id, text: d.listName, leaf: false, iconCls: 'icon-folder', editable: true, expanded: true, isFolder: true }); }else{ n = new Ext.tree.TreeNode({ id: record.id, text: d.listName, leaf: true, iconCls: 'icon-list', editable: true }); } return n; } });