プログラミングノート

一からものを作ることが好きなエンジニアの開発ブログです。

TreePanelの生成方法について

単純なツリーを生成する方法をまとめてみました。
サンプルと全体のソースはこちらから参照できます。

1. TreeNode指定で生成

Ext.tree.TreeNodeでノードを生成してツリーに追加していく方法です。ツリーを初期化した後、イベントでノードを追加していく際などに利用しそうな感じ。

var tree = new Ext.tree.TreePanel({
  el: 'tree',
  listeners: {
    'click': function(node){
      alert('id:' + node.id);
    }
  }
});

var root = new Ext.tree.TreeNode({
  id: 'rootNode',
  text: 'rootNode', 
  leaf: false
});

var child1 = new Ext.tree.TreeNode({
  id: 'childNode1',
  text: 'childNode1',
  leaf: false
});

var leaf1 = new Ext.tree.TreeNode({
  id: 'leaf1',
  text: 'leaf1',
  leaf: true
});

child1.appendChild(leaf1);
root.appendChild(child1);
tree.setRootNode(root);   

tree.render();

2. JSON(ローカル変数)指定で生成

rootノードを追加する際にJSON形式でチャイルドノードを指定して初期化できます。Ext.tree.AsyncTreeNodeを利用するみたいです。

var tree2 = new Ext.tree.TreePanel({
  el: 'tree2',
  listeners: {
    'click': function(node){
      alert('id:' + node.id);
    }
  }
});

var root = new Ext.tree.AsyncTreeNode({
  id: 'rootNode',
  text: 'rootNode', 
  children: [{
      id: 'childNode1',
      text: 'childNode1',
      children: [
          { id: 'leaf1-1', text: 'leaf1-1', leaf: true },
          { id: 'leaf1-2', text: 'leaf1-2', leaf: true }
      ]
    },{
      id: 'childNode2',
      text: 'childNode2',
      children: [
          { id: 'leaf2-1', text: 'leaf2-1', leaf: true },
          { id: 'leaf2-2', text: 'leaf2-2', leaf: true }
      ]
  }]
});
tree2.setRootNode(root);
 
tree2.render();

3. JSON(サーバから)指定で生成

サーバからJSONデータをロードして初期化する方法です。Ext.tree.TreeLoaderで取得先のURLを指定します。ノードがクリックされた際、そのノード名がPOSTパラメタ(node)としてget-json.phpに渡されます。

var tree3 = new Ext.tree.TreePanel({
  el: 'tree3',
  loader: new Ext.tree.TreeLoader({
      dataUrl:'get-json.php'
  }),
  listeners: {
    'click': function(node){
      alert('id:' + node.id);
    }
  }
});

var root = new Ext.tree.AsyncTreeNode({
  id: 'rootNode',
  text: 'rootNode'
});
tree3.setRootNode(root);
 
tree3.render();

4. XML(サーバから)指定で生成

サーバからXMLデータをロードして初期化する方法です。XMLを利用する場合はクラスを自前で作る必要がありますが、ExtJS付属サンプルのXmlTreeLoader.jsにExt.ux.XmlTreeLoaderというクラスがあるのでこれを利用すれば少し楽ができます。


Ext.ux.XmlTreeLoaderがXMLをパースしてくれるので、Ext.app.BookLoaderでどの情報をツリーに表示するかを定義しているだけです(ExtJSサンプルほぼそのままです)。attr.textがツリーに表示される文字列です。

Ext.app.BookLoader = Ext.extend(Ext.ux.XmlTreeLoader, {  
  processAttributes : function(attr){
      if(attr.first){
        attr.text = attr.first + ' ' + attr.last;
        attr.loaded = true;
      }else if(attr.title){
        attr.text = attr.title + ' (' + attr.published + ')';
        attr.leaf = true;
      }
  }
});

var tree4 = new Ext.tree.TreePanel({
  el: 'tree4',
  autoScroll: true,
  listeners: {
    'click': function(node){
      alert('id:' + node.id);
    }
  },
  root: new Ext.tree.AsyncTreeNode({
    id: 'rootNode',
    text: 'rootNode'
  }),
  loader: new Ext.app.BookLoader({
      dataUrl:'get-xml.php'
  })
});

tree4.render();


昔はツリーを作るだけで一苦労だったのにこんなに簡単にできるとは。。
CosmoDBとか大分前に作ったWebアプリをExtで作り直したいなと思う今日この頃です。