当前位置: 代码迷 >> Java Web开发 >> 100分急求:后台JSON数据能取到,但ExtJS Grid 表格不显示数据(本地data可以显示) [有关问题点数:100分]
  详细解决方案

100分急求:后台JSON数据能取到,但ExtJS Grid 表格不显示数据(本地data可以显示) [有关问题点数:100分]

热度:24   发布时间:2016-04-16 22:02:26.0
100分急求:后台JSON数据能取到,但ExtJS Grid 表格不显示数据(本地data可以显示) [问题点数:100分]
struts2.3+extjs4.2,store中如果配置本地data,grid能正确显示;但如果配proxy(ajax)访问struts,json数据能返回(chrome控制台正确输出了),但grid就是不显示数据,如图。


----------------------------


发现一个问题:表格的行数恰好是返回json串的字符个数(图中没有截取完整),所有行都没有内容;如果吧store文件中的reader的type改为array,则每行能显示一个字符。

折腾了一晚上,能找到的所有方法都试过了。100分跪求高人解答,长期在线,文件都贴在下面了。
---------------------
下面是源代码
------------------------
view文件(ems.view.RoleManager):

Ext.define('ems.view.RoleManager',{
    extend: 'Ext.grid.Panel',
    title: '角色管理',
    alias : 'widget.roleManager',
    store: 'RoleStore',
    
    columns: [
  {text: 'id', dataIndex: 'id'},
  {text: 'name', dataIndex: 'name'}
],

    initComponent : function() {
        this.callParent(arguments);
    }
});


model文件(ems.model.Role):

Ext.define("ems.model.Role", {
extend: "Ext.data.Model",
fields: [
{name: 'id', type: 'string'},
{name: 'name', type: 'string'}
]
}); 


store文件(ems.store.RoleStore):


Ext.define('ems.store.RoleStore', {
extend: 'Ext.data.Store',
model: 'ems.model.Role',
storeId: 'role_store',

proxy: {             //  用远程数据,grid就不能显示数据????
         type: 'ajax',
         url: 'role_list.do', // struts的action方法
         reader: {
             type: 'json',
             root: 'myData'
         }
    },
    
//    data:[                     // 直接使用本地写死数据,grid可以正确显示这2条数据
//     {id:'1',name:'222'},
//     {id:'3',name:'ss'}
//    ],
    autoLoad: true
});


controller文件(ems.controller.RoleCtrl):


Ext.define('ems.controller.RoleCtrl', {
    extend: 'Ext.app.Controller',
views:['RoleManager'],
models:['Role'],
stores:['RoleStore'],

    init: function() {
        this.control({
        
        });
    }
});


struts的action方法:

public String list() {
List<Role> list = roleBiz.findAllRoles();
// myData = JsonUtils.toJson(list, new String[]{"userRoles", "permissions"});
myData="[{\"id\":\"1\", \"name\":\"ddd\"}]";
success = true;
return SUCCESS;
}


入口app.js:


Ext.onReady(function() {
Ext.Loader.setConfig({ enabled: true, disableCaching: true });

Ext.application({
name : 'ems',
appFolder : 'app',
controllers:['RoleCtrl'],

launch : function() {
Ext.create('Ext.container.Viewport', {
layout : 'fit',
items: [ { // west
xtype: 'roleManager', 
width: 140,
margins: '3 0 3 5',
id: 'west'
}]
});
}
});
});


-------------------------
不要说JSON格式不对什么的,就2个列,都是字符串,加单、双引号都试过了,就是不行。跟struts版本估计没关系,浏览器能输出json信息,会不会是extjs 4.2.1的bug?
跪求高人解答,100分奉送!
------解决方案--------------------
调整你服务端程序,是指输出形如这样的串
{"myData":[{"id":"1", "name":"ddd"}]

------解决方案--------------------
Java 难道没有从对象或数组构造出 json 的方法吗?
真太奇怪了

这一项碰到好几个这样的问题了
------解决方案--------------------
引用:
Quote: 引用:

还真可能是json格式的问题,应该是像下面这样的,因为是数组,所以在方括号外面不应该有引号。

"myData":[{\"id\":\"1\", \"name\":\"ddd\"}]


就是你说的问题,struts的action里面是:
myData="[{id:1,name:'2222'}]";

但strus的json插件生成的json居然是:"myData":"[{id:1,name:'2222'}]"——————自动在[]外面加了双引号,怎么解决?


你的myData就是字符串,当然会自动加上双引号。。还是移动到java版块去吧你这个问题
------解决方案--------------------
action里myData不要自己手动改为String类型的json字符串,直接赋为json对象,struts返回json的时候,自己回序列化,所以你的代码是二次序列化的结果。
------解决方案--------------------
  相关解决方案