日期:2014-05-16  浏览次数:20688 次

Ext获取treepanel的root的json字符串
就一个很点单的界面,

var tree = new Ext.tree.TreePanel({
id:'tree',
        height: 300,
        width: 400,
        useArrows:true,
        autoScroll:true,
        animate:true,
        enableDD:true,
        containerScroll: true,
        rootVisible: false,
        frame: true,
        root: {
            nodeType: 'async'
        },
        
        dataUrl: 'OutputTree',
        
        listeners: {
            'checkchange': function(node, checked){
                if(checked){
                    node.getUI().addClass('complete');
                }else{
                    node.getUI().removeClass('complete');
                }
            }
        }
    });

    tree.getRootNode().expand(true);
    
var win2=new Ext.Window({
title:"选择指标",
id:'win2',
width:414,
height:375,
layout:"absolute",
tools:tools,
items:[
tree,
{
xtype:"button",
text:"确定",
x:300,
y:310,
handler:function(){
alert(Ext.getCmp('tree').root);
var str = Ext.util.JSON.encode(Ext.getCmp('tree').root);
alert(str);
}
},
{
xtype:"button",
text:"取消",
x:350,
y:310,
handler:function(){
Ext.getCmp('win2').destroy();
}
}
]
});
win2.show();

我现在想点击确定按钮,弹出个alert,并且显示treepanel的root的json字符串。就是他的dataURL获得的东西。
但是我用的代码:var str = Ext.util.JSON.encode(Ext.getCmp('tree').root);
alert(str);报错,说堆栈溢出!有什么解决方法或者有什么其他方法来实现这个功能吗?
求高手赐教。

------解决方案--------------------
好像不行,会循环调用导致堆栈溢出。

你可以通过getStore得到store,然后遍历store来获取所有数据行

var store=Ext.getCmp('tree').getStore();
var models=store.getRange()//得到Ext.data.Model[]数组
for(i=0;i<models.length;i++)
alert(models[i].getData())

------解决方案--------------------
root里面是一个ExtJS 数据对象并不是JSON对象,而你用的Ext.util.JSON.encode是专门针对转换JSON数据格式和String时使用。
试试这个:GOODLUCK

var str =Ext.util.JSON.encode(Ext.getCmp(