最近在做一个extjs+SSH的项目,有个需求要用到grid动态生成列。
其中action中方法代码如下:
public String getPoqutityGridByPoId(){
PoqutityGridForm pf = purchaseOrderService.getPoqutityByPoIdgrid(detailPoId);
if(pf==null){
this.setJsonString("{result:[],totalRecord:0}");
return "fail";
}
List columnList = pf.getColNames();
List dataList = pf.getColValues();
JSONArray column = JSONArray.fromObject(columnList);
JSONArray data = JSONArray.fromObject(dataList);
String message ="{column:" +column.toString()+", data:"+data.toString()+"}";
this.setMessage(message);
this.setJsonString("{success:true, msg:'"
+ this.getMessage().toString() + "'}");
return this.SUCCESS;
}
在js中这样获得数据:
var cm;
var ds;
Ext.ajax.request({
url:'getPoqutityGridByPoId.do?detailPoId='+poId,
method:'post',
success:
function(response,options){
alert(response.responseText);
var json = Ext.util.JSON.decode(response.responseText);
var realjson = Ext.util.JSON.decode(json.msg);
cm = new Ext.grid.ColumnModel(realjson.column);
ds = new Ext.data.JsonStore({
data:realjson.data,
fields:['color','col1','col2','col3','col4','col5','col6','col7','col8','col9','col10','total']
});
},
failure:
function (){
}
});
后面生成grid
var podetailgrid = new Ext.grid.GridPanel({
title:"",
cm:cm,
ds:ds,
viewConfig: {
forceFit:true
},
frame:true,
collapsible: true,
animCollapse: false,
iconCls: 'icon-grid'
});最后显示grid
var pnl = new Ext.Viewport({
layout: 'border',
items: [
{
region : 'north',
autoScroll : true,
border:false,
height: 720,
items: basePanel
},
{
region : 'center',
autoScroll : true,
border:false,
layout: 'fit',
items: podetailgrid
},
{
region : 'south',
autoScroll : true,
border:false,
height: 300,
minSize: 300,
maxSize: 600,
items: grid
}
]
});
在获取数据阶段我alert过,数据是有的,但是在生成grid的时候报出q is undefined的错误,请问到底应该怎么做啊?尝试了网上的好几个方法,快崩溃啦,求大侠们帮忙想想办法~~
其中action中方法代码如下:
public String getPoqutityGridByPoId(){
PoqutityGridForm pf = purchaseOrderService.getPoqutityByPoIdgrid(detailPoId);
if(pf==null){
this.setJsonString("{result:[],totalRecord:0}");
return "fail";
}
List columnList = pf.getColNames();
List dataList = pf.getColValues();
JSONArray column = JSONArray.fromObject(columnList);
JSONArray data = JSONArray.fromObject(dataList);
String message ="{column:" +column.toString()+", data:"+data.toString()+"}";
this.setMessage(message);
this.setJsonString("{success:true, msg:'"
+ this.getMessage().toString() + "'}");
return this.SUCCESS;
}
在js中这样获得数据:
var cm;
var ds;
Ext.ajax.request({
url:'getPoqutityGridByPoId.do?detailPoId='+poId,
method:'post',
success:
function(response,options){
alert(response.responseText);
var json = Ext.util.JSON.decode(response.responseText);
var realjson = Ext.util.JSON.decode(json.msg);
cm = new Ext.grid.ColumnModel(realjson.column);
ds = new Ext.data.JsonStore({
data:realjson.data,
fields:['color','col1','col2','col3','col4','col5','col6','col7','col8','col9','col10','total']
});
},
failure:
function (){
}
});
后面生成grid
var podetailgrid = new Ext.grid.GridPanel({
title:"",
cm:cm,
ds:ds,
viewConfig: {
forceFit:true
},
frame:true,
collapsible: true,
animCollapse: false,
iconCls: 'icon-grid'
});最后显示grid
var pnl = new Ext.Viewport({
layout: 'border',
items: [
{
region : 'north',
autoScroll : true,
border:false,
height: 720,
items: basePanel
},
{
region : 'center',
autoScroll : true,
border:false,
layout: 'fit',
items: podetailgrid
},
{
region : 'south',
autoScroll : true,
border:false,
height: 300,
minSize: 300,
maxSize: 600,
items: grid
}
]
});
在获取数据阶段我alert过,数据是有的,但是在生成grid的时候报出q is undefined的错误,请问到底应该怎么做啊?尝试了网上的好几个方法,快崩溃啦,求大侠们帮忙想想办法~~
有可能会是你用ajax请求了数据,但是ajax请求还没返回的时候,底下的代码已经执行了,那肯定不对了
可能是异步的问题,异步加载数据的时候。后面的代码不会等待签名的ajax执行完了才执行的。
你将异步设为同步看看
success:
function(response,options){
alert(response.responseText);
var json = Ext.util.JSON.decode(response.responseText);
var realjson = Ext.util.JSON.decode(json.msg);//确定这里的object中可以拿到column并且是一个object就没有问题了
cm = new Ext.grid.ColumnModel(realjson.column);
ds = new Ext.data.JsonStore({
data:realjson.data,
fields:['color','col1','col2','col3','col4','col5','col6','col7','col8','col9','col10','total']
});
},
2种方法
1、下载官方提供的ext-basex.js里面封装了Ext.Ajax.request的同步参数设置
参考:http://www.cnblogs.com/fengmiaosen/archive/2010/06/23/1763484.html2、直接用ext-base.js中的方法,但是需要重写
具体参考:URL很长
这样能保证请求的数据已经返回
试下看.
参考API上 JsonReader,开头有个metaData的例子,就是用来动态生成列的
API上漏了一个最重要的属性
{
metaData: {
"idProperty": "id",
"root": "rows",
"totalProperty": "results"
"successProperty": "success",
colModel:[{dataIndex:'col1', header: 'Column 1'}, ...], // API漏了这个
"fields": [
{"name": "name"},
{"name": "job", "mapping": "occupation"}
],
试过放在回调方法success中生成grid
但是这样在这个方法外就不能用到grid了,怎么把这个grid布局到viewport中?
var cm;
var ds;
Ext.ajax.request({
url: 'getPoqutityGridByPoId.do?detailPoId=' + poId,
method: 'post',
success: function(response, options) {
alert(response.responseText);
var json = Ext.util.JSON.decode(response.responseText);
var realjson = Ext.util.JSON.decode(json.msg);
cm = new Ext.grid.ColumnModel(realjson.column);
ds = new Ext.data.JsonStore({
data: realjson.data,
fields: ['color', 'col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7', 'col8', 'col9', 'col10', 'total']
});
//将grid写在这里,有关异步的操作
var podetailgrid = new Ext.grid.GridPanel({
title: "",
cm: cm,
ds: ds,
viewConfig: {
forceFit: true
},
frame: true,
collapsible: true,
animCollapse: false,
iconCls: 'icon-grid'
}); 最后显示grid
var pnl = new Ext.Viewport({
layout: 'border',
items: [{
region: 'north',
autoScroll: true,
border: false,
height: 720,
items: basePanel
},
{
region: 'center',
autoScroll: true,
border: false,
layout: 'fit',
items: podetailgrid
},
{
region: 'south',
autoScroll: true,
border: false,
height: 300,
minSize: 300,
maxSize: 600,
items: grid
}]
});
},
failure: function() {}
});
按照你的说法,真的解决了,太感谢啦,我想问一下,为什么这个地方要把viewport放在ajax.request里面才可以呢?按理来说,我把request设成同步的话viewport放在后面不也可以获得数据了吗?
是的,因为异步的时候数据没有获取,才导致错误的。如果用同步就不用改了
也可以用setTimeout延时获取
用异步放在回调函数中即可
设置同步参考7#
可是我用同步的时候还是会q is undefined啊?只有放在request里面的才成功了。同步的我是这样写的,是不是写法还是不对?:
Ext.Ajax.request({
url:'getPoqutityGridByPoId.do?detailPoId='+poId,
method:'post',
async:false,
success:
function(response,options){
alert(response.responseText);
var json = Ext.util.JSON.decode(response.responseText);
var realjson = Ext.util.JSON.decode(json.msg);
cm = new Ext.grid.ColumnModel(realjson.column);
ds = new Ext.data.JsonStore({
data:realjson.data,
fields:['color','col1','col2','col3','col4','col5','col6','col7','col8','col9','col10','total']
});
},
failure:
function (){
//results="";
}
});
var podetailgrid = new Ext.grid.GridPanel({
title:"",
cm:cm,
ds:ds,
viewConfig: {
forceFit:true
},
frame:true,
collapsible: true,
animCollapse: false,
iconCls: 'icon-grid'
});
var pnl = new Ext.Viewport({
layout: 'border',
items: [
{
region : 'north',
autoScroll : true,
border:false,
height: 720,
items: basePanel
},
{
region : 'center',
autoScroll : true,
border:false,
layout: 'fit',
items: podetailgrid
},
{
region : 'south',
autoScroll : true,
border:false,
height: 300,
minSize: 300,
maxSize: 600,
items: historygrid
}
]
});