浏览 462 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2008-07-11
利用类似asp.net ajax的通信机制,ext用过Ext.ajax也可以与webservice通信,从客户端请求返回json字符串,然后通过Ext.json.decode解码成json对象,填充gridPanel,但出现一个很奇怪的问题,传输的json如果是数组的形式,如[{id:1,name:ext},{id:2,name:'ext2'}]或者[{'id':1,'name':'ext'},{'id':2,'name':'ext2'}]的数据就可以填充到gridPanel,而当json字符串是{'results':4,'rows':[{"id":1,"name":"aaa","organization":"23","homepage":"135"},{"id":1,"name":"aaa","organization":"23","homepage":"135"},{"id":0,"name":"test","organization":"wblog","homepage":"www.witperblog.cn"},{"id":1,"name":"test","organization":"wblog","homepage":"www.witperblog.cn"}]}
这种形式的时候,经过decode变成json对象后,填充gridPanel的时候会出现prototype为空或不为对象,调试后发现是json对象下的prototype为空,再调试json对象,typeof jsonData的结果是object,那它的prototype怎么是空呢?不解,请大家帮帮忙,下面是代码: Ext.onReady(function(){ Ext.QuickTips.init(); Ext.Ajax.on('beforerequest', function(conn, options){ conn.defaultHeaders = {'Content-Type': 'application/json; charset=utf-8'} }); Ext.Ajax.on('requestcomplete', function(conn, response, options){ response.responseText = Ext.util.JSON.decode(response.responseText); }); var param ="{id:1,name:'EasyJWeb',organization:'EasyJF',homepage:'www.easyjf.com'}"; Ext.Ajax.request({ url:"WebService.asmx/getJson", method:"POST", jsonData:{name:param}, success:onSuccess, failure:onFailure }); function onSuccess(response,options) { Ext.Msg.alert("Data",response.responseText); var dataStr = response.responseText; var dataJson =new Ext.util.JSON.decode(dataStr); var record =Ext.data.Record.create([{name:"id",mapping:"id"},{name:"name",mapping:"name"},{name:"organization",mapping:"organization"},{name:"homepage",mapping:"homepage"}]); var reader =new Ext.data.JsonReader({totalProperty:"results",root:"rows",id:"id"},record); var store = new Ext.data.JsonStore({autoLoad:true,data:dataJson,reader:reader}); store.load(); var nm = new Ext.grid.RowNumberer(); var selM = new Ext.grid.CheckboxSelectionModel(); var colM=new Ext.grid.ColumnModel([nm,selM,{header:"序号",dataIndex:"id",sortable:true},{header:"项目名称",dataIndex:"name",sortable:true,tooltip:"项目名称"}, {header:"开发团队",dataIndex:"organization",sortable:true}, {header:"网址",dataIndex:"homepage",sortable:true}]); var grid = new Ext.grid.GridPanel({ renderTo:"hello", viewConfig:{forceFit:true}, title:"ExtJs test", height:300, iconCls:'icon-grid', trackMouseOver:true, frame:true, width:600, cm:colM, sm:selM, store:store, animCollapse:true, collapsible:true, tbar:[{ id:'btnAdd', text:'新增', tooltip:'新增', iconCls:'add', handler:showAddPanel },'-',{ text:'查询', tooltip:'查询', iconCls:'search' },'-',{ text:'批量删除', tooltip:'删除', iconCls:'remove' }] }); }); 其实webservice返回的json字符串是: {'results':4,'rows':[{"id":1,"name":"aaa","organization":"23","homepage":"135"},{"id":1,"name":"aaa","organization":"23","homepage":"135"},{"id":0,"name":"test","organization":"wblog","homepage":"www.witperblog.cn"},{"id":1,"name":"test","organization":"wblog","homepage":"www.witperblog.cn"}]} 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2008-07-11
刚刚找到解决的办法,写了一大堆,后来发表,竟然不成功,心血啊
|
|
| 返回顶楼 | |
|
时间:2008-07-11
查了很多资料,找到官方论坛,发现JsonStore的不支持reader属性,reader属性是继承于Store,为何不支持呢?官方解释:“JsonStore doesn't have a reader config option (only Store has one).”,他给出的解决办法是:
Use: var jsonStore = new Ext.data.Store({ url: 'myurl', reader: new Ext.data.JsonReader({}, ['id', 'name']) }); or var jsonStore = new Ext.data.JsonStore({ url: 'myurl', fields: ['id', 'name'] }); 从他第一个解决的办法,可以看出JsonStore还是可以有reader这个属性,感觉莫名其妙,由此相处上面提到的解决办法: var store = new Ext.data.JsonStore({root:"rows",fields:[{name:"id",mapping:"id"},{name:"name",mapping:"name"},{name:"organization",mapping:"organization"},{name:"homepage",mapping:"homepage"}]}); store.loadData(dataJson); 在JsonStore创建的时候不定义data或者url属性,而是创建后利用loadData()方法动态加载json对象,对于这样反而成功,我不得其解,为什么对象创建的时候赋予数据不沉成功,创建后动态加载反而成功?前者会出现prototype为空的错误信息。调试会跳转到源文件里面,叫人很无奈,调试ext是一个问题。正在研究其源码... |
|
| 返回顶楼 | |
|
时间:2008-07-14
几天后,竟然没人可以解释这个问题吗?我发觉extjs数据通信太麻烦了,虽然只要格式是json或者xml就可以通信,但是总是出现莫名其妙的错误
ps:本人用extjs 2.1 + .net 测试 |
|
| 返回顶楼 | |
|
时间:2008-08-08
去得 store.load();
|
|
| 返回顶楼 | |



