Ext 异步树问题

第一次加载树的时候,root节点下的子节点,
能够通过执行action返回json获得并显示 ,
但是,在点击节点的时候,虽然触发了事件,
但是不执行action了.前后台没报任何错...

源码如下:
Ext.onReady(function(){
//Ext.BLANK_IMAGE_URL="ext/resources/images/default/s.gif";
var Tree = Ext.tree;

    var loader=new Tree.TreeLoader({dataUrl:'createTree.do?method=CreateTree'});  


    var root = new Tree.AsyncTreeNode({    
       text: '看看',    
       draggable:false,    
       id:'1'

    }); 

    var tree = new Tree.TreePanel({ 
        el:'tree-div', 
        lines:true, 
        rootVisible:true,//根节点是否可见 
        useArrows:true,//小箭头 
        autoHeight:true, 
        split:true, 
        autoScroll:true, 
        animate : false,//动画效果 
        enableDD:true,//允许拖拽 
        border : false, 
        containerScroll: true, 
        loader: loader
    }); 


    tree.on('beforeload', function(node){     //单击节点加载该节点的子节点 

*** //alert("node.id-->"+node.id); //事件是能进入的,我测试了
*** tree.loader.dataUrl = 'createTree.do?method=CreateTree&id'='+node.id;
});

    // 设置根节点 
     tree.setRootNode(root); 
    tree.render(); 

}); 

贴一下第一次返回的数据。
看看是否有包含children这个属性.如果有的话,去掉它

我用LZ的代码是可以的,估计你返回的json有问题。

难道tree.loader.dataUrl = 'createTree.do?method=CreateTree&id'='+node.id; 的id后多了个'???

可以参考我写的调用方式:
[code="java"]

/**

  • 重新加载数据
  • @param params */

var treeLoad = new Ext.tree.TreeLoader({
url : "createTree.do",
requestMethod : 'POST',
baseParams:{method:'CreateTree',id:node.id}
});

treeLoad .on('beforeload', function(treeLoader, node) {
var id = node.attributes.id;
var para = {id:id};

   Ext.apply(treeLoader.baseParams , para);
            if( treeLoader.baseParams == null ){
                treeLoader.baseParams = para;
            }

            treeLoader.url = node.attributes.url;

            return true;
    }, treeData);

//----------------------------------------------------
var treeLoad = treePanel.getLoader();
treeLoad.baseParams = params;
treeLoad.load(root, function(){});//重新加载数据
this.expandAll();
},[/code]
从后台返回的json必需是这种格式:

1、有id
2、有text
3、必需是集合

例:

[{id:'001',text:'我的第一个节点',children:[{id:'001-01',text:'儿子节点'}] }]

最后你的语法有错:

我明白你现在遇到的问题:

你遇到的问题,我估计是,点击子节点时无法触发“请求--load()”方法。

提供2解决方案给你。

1.在onclick事件里,获取点击的节点,
调用 load()方法请求数据。

2.异步加载,节点的lear属性必需为false,即它不是叶子节点,当点击时,EXT会自动触发load()方法。

无论你是使用 1或2.
都必需写'beforeload'事件,它的作用是将,当前点击的节点的属性:url刷新给即将要请求到后台的请求路径。
这个url节点属性,可在后台json构建时制定,这样每一个节点都能到不同的action去请求数据。
这才是真正的异步。

treeLoad .on('beforeload', function(treeLoader, node) {

.......
.......

treeLoader.url = node.attributes.url;

.......
.......
}, treeData);

你只是指定了加载数据URL,并没有加载。需要调用一下load方法。
tree.on('beforeload', function(node){
tree.loader.dataUrl = 'createTree.do?method=CreateTree&id'='+node.id;
[color=red]tree.loader.load(node);[/color]
});

[code="java"]
[{"text":"看看","parentId":"{9207F055-98C4-8E45-8E77-6503753FA824}","mobile":"","href":"","cls":"folder","leaf":false,"checked":false,"id":"{3820E7D3-9529-3C48-9CD9-D2360A2B367F}","children":[]},
{"text":"区委各部、群众团体","parentId":"{9207F055-98C4-8E45-8E77-6503753FA824}","mobile":"","href":"","cls":"folder","leaf":false,"checked":false,"id":"{8CA7BC78-4D3C-514A-A3ED-448BA12B66AC}","children":[]},………………]

把这里面的"children":[]去掉就行啦

[/code]