ExtJS6.0和后台交互数据渲染到表格中并实现分页,以及解决跨域提取数据(一)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/mianxing2357/article/details/88355685

官方文档api: https://docs.sencha.com/extjs/6.2.0/modern/Ext.data.Store.html

 一、与后台交互并实现分页

我们可以从官方api看到数据源store的定义
å¨è¿éæå¥å¾çæè¿°
我们要将数据展示出来,需要渲染到gridpanel中,gridpanel需要如下基本数据
å¨è¿éæå¥å¾çæè¿°
这里最后做说明,解决跨域通过jsonp
å¨è¿éæå¥å¾çæè¿°
需要 model(数据模型)、proxy(数据代理)、reader(数据读取器)等,这三个基本满足所需效果,autoload:自动加载,
接下来定义一个panel,将gridpanel放进去,user.js文件如下(非跨域)

  Ext.define("Admin.view.user.user", {
        extend: 'Ext.panel.Panel',
        xtype: 'user',// 将用在在main.js
        requires: [
            // 当引用其他js时,加入依赖,如controller,viewModel等
        ],
        layout: 'border',
        height: window.innerHeight - 50,
        defaults: {
            collapsible: false,
            split: false
        },
        viewModel:{
            stores:{
                infostore:{
                    pageSize:6,//每页多少条数据
                    model: new Ext.data.Model({
                        fields:[  
                            {name:'userId',type:'int'},  
                            {name:'userName',type:'string'},
                            {name:'userBir',type:'string'}   
                        ]
                    }),
                    proxy: {
                        type: "ajax",
                        url: "/good/getUsers",//请求url 
                        actionMethods : { 
                            read : 'POST',
                        },//以post方式提交
                        reader: {
                            type: 'json',
                            rootProperty: 'data',//数据
                            totalProperty : 'rows',//数据总数
                        }
                    },
                    autoLoad: true,//自动加载
                }
            }
        },
        items: [
            {
                xtype: "gridpanel",  //gridpanel
                selType: "checkboxmodel",//多选框
                title: "信息管理",
                region: 'center',
                border: true,
                bind:{
                  store:'{infostore}'//将数据绑定到当前panel中,
                },
                columns: [
                    { text: '序号', sortable: true, dataIndex: 'userId', align: 'center' },
                    { text: '名称', sortable: true, dataIndex: 'userName', align: 'center' },
                    { text: '日期', sortable: true, dataIndex: 'userBir', align: 'center' }],
                    // 根据columns中的datandex字段进行赋值,该字段需要和接收的数据名称一致,
                bbar: {
                    xtype: "pagingtoolbar", //分页工具
                    displayInfo: true,
                    displayMsg: '显示{0}-{1}条,共{2}条',
                    emptyMsg: '无数据'
                }
            },
        ],
    });          

我的请求返回的json数据如下:

 {
        "success": true,
        "msg": "成功",
        "data": [{
            "userId": 1,
            "userName": "雄安",
            "userBir": "2019-03-13"
        }, {
            "userId": 2,
            "userName": "小白",
            "userBir": "2019-03-03"
        }, {
            "userId": 3,
            "userName": "小子",
            "userBir": "2019-03-11"
        }, {
            "userId": 6,
            "userName": "小猫",
            "userBir": "2019-02-25"
        }, {
            "userId": 8,
            "userName": "安安",
            "userBir": "2019-02-03"
        }, {
            "userId": 12,
            "userName": "大黑",
            "userBir": "2019-01-27"
        }],
        "rows": 17
    }


该项目是通过sencha cmd 一键生成的,在其基础上进行添加
å¨è¿éæå¥å¾çæè¿°

 接下来就是效果,在main.js中加入依赖requires: ["Admin.view.user.user"]
 在原有的的items中加入

 {
        title: 'Tabel',
        iconCls: 'fa-users',
        xtype:'user',
    }


å¨è¿éæå¥å¾çæè¿°

二、解决跨域问题


我刚开始做的是sencha cmd启动extjs项目,然后再通过tomcat中去访问java程序,
报异常
å¨è¿éæå¥å¾çæè¿°
解决方法有很多种,我尝试了很多,有一种行之有效,就选用了jsonp
java代码需要自己另写一段代码callback

JSONObject obj = new JSONObject();
            obj.put("rows", list.size());
            obj.put("data", list);
    boolean jsonP = false;
    String cb = request.getParameter("callback");
    if (cb != null) {
        jsonP = true;
        response.setContentType("text/javascript");
    } else {
            response.setContentType("application/x-json");
    }
    if (jsonP) {
        out.write(cb + "(");
    }
    out.print(obj);//写回的json数据
    if (jsonP) {
        out.write(");");
    }


关键部分到了,需要修改Extjs中store的proxy代理

 proxy: { 
                type: 'jsonp',
               url:"http://localhost:8888//getForm1" ,
               //callbackKey: 'theCallbackFunction',
               extraParams  : {                           
                // "userId" : id //如需传递参数
                }, 
               reader:  {
                type: 'json',
                rootProperty: 'data',
                totalProperty : 'rows'
               }
       },    

我的请求返回的jsonp数据如下

Ext.data.JsonP.callback4({"data":[{"userBir":"2019-03-13","userId":1,"userName":"雄安"},{"userBir":"2019-03-03","userId":2,"userName":"小白"},{"userBir":"2019-03-11","userId":3,"userName":"小子"},{"userBir":"2019-02-25","userId":6,"userName":"小猫"},{"userBir":"2019-02-03","userId":8,"userName":"安安"},{"userBir":"2019-01-27","userId":12,"userName":"大黑"}],"rows":17});

å¨è¿éæå¥å¾çæè¿°

上面属于接收数据,Extjs提交数据请求如下:

Ext.data.JsonP.request({
			url: 'http://localhost:8888/setForm',
			timeout: 300000,
			params: ar.getValues(),
			callbackKey: "jsonPCallback",
			success: function(result) {
				console.log(result);
			},
			failure: function(result) {
				alert(result);
			}
			
		})
// 当你要返回成功或者失败是也需要进行callback写回,同上,然后request中的success或failure会生效,例:

String cb = request.getParameter("callback");
				if (cb != null) {
					jsonP = true;
					response.setContentType("text/javascript");
				} else {
					response.setContentType("application/x-json");
				}
				if (jsonP) {
					out.write(cb + "(");
				}
				out.print(JSON.toJSON("{\"success\":\"success\"}"));
				if (jsonP) {
					out.write(");");
				}

这是我的解决办法,还有其他方法,有比较简单易懂的,还请路过的伙伴留下你的见解,(^o^)

猜你喜欢

转载自blog.csdn.net/mianxing2357/article/details/88355685