ExtJS 4.2 业务支出(二)数据体现和查询

ExtJS 4.2 Grid组件自己并从未提供单元格合并成效,要求协调达成这几个效应。

本篇初始效仿2个船只管理种类,提供查询、添加、修改船只的成效,那里介绍在那之中的数额彰显和询问功效。

 目录

  1. 原理

2.
多列合并

3.
代码与在线演示

 

目录

1.
数码展示

2.
数据查询

  1. 在线演示

 

1. 原理

1. 数量展现

在那边我们将效仿二个船只管理连串,并提供查询、添加、修改的功能。

大致的目录结构如下:

图片 1

ShipMgrTab.js :船只业务的输入。

controller 目录:存放船只业务的逻辑控制文件。

model 目录:存放船只业务的model文件。

store 目录 :存放船只业务的store文件。

view 目录 :存放船只业务的零件文件。

1.1 HTML代码分析

率先成立一个Grid组件,然后查看下的HTML源码。

1.1 设定Model

在展现数据以前要先做一些准备功效,比如工作与服务器数据交互的办法。

Model代表事情的实业对象,在那边设定船只的Model:

Ext.define('App.ShipMgr.model.ShipModel', {
    extend: 'Ext.data.Model',
    fields: [
        { name: 'ShipId', type: 'string', remark: '船舶ID' },
        { name: 'ShipName', type: 'string', remark: '船舶名称' },
        { name: 'State', type: 'string', remark: '状态' },
        { name: 'StateName', type: 'string', remark: '状态名称' },
        { name: 'Tonnage', type: 'string', remark: '吨位' },
        { name: 'LoadNumber', type: 'int', remark: '核载人数' },
    ]
});  

  

 

1.1.1 Grid组件

图片 2

1.2 设定Store

Store卷入了四个Model对象的缓存,通过 Proxy 加载数据,并提供了对数码开始展览排序、筛选和询问的意义。 (在此处只是简单写出必要的Model和Store;若须求对Mode、
Store和Proxy三者具体涉及的询问可以访问 http://docs.sencha.com/extjs/4.2.1/#!/guide/data)

var shipMgrStore = Ext.create('Ext.data.Store', {
    model: 'App.ShipMgr.model.ShipModel',
    pageSize: 25,
    autoLoad: true,
    proxy: {
        type: 'ajax',
        url: '/Business/ShipMgr/Query',
        reader: {
            reader: 'json',
            root: 'data',
            totalProperty: 'rowCount',
        },
        actionMethods: {
            create: 'Post'
        }
    }
});

 

1.1.2 HTML代码

图片 3

从这几个代码中得以见见,Grid组件可分为grid-header和grid-body
两块区域(若含有工具栏和分页栏,它们都会含有各自的单身区域)。

内部grid-body包括了重重tr成分,每贰个tr都以代表Grid组件中的一行数据;每种tr内部都包涵了很多td,每一种td表示1个单元格。

1.3 创建Grid组件

Grid组件常用语业务中数据的列表体现。

// 创建grid
var shipMgrGrid = Ext.create('Ext.grid.Panel', {
    store: shipMgrStore,
    columnLines: true,
    rowLines: true,
    bbar: Ext.create('Ext.toolbar.Paging', {
        store: shipMgrStore,
        pageSize: 25,
        displayInfo: true,
        displayMsg: '当前显示第{0}行到第{1}行,一共{2}行。',
        emptyMsg: '没有任何记录'
    }),
    columns: [
        Ext.create('Ext.grid.RowNumberer', {
            text: '序号',
            width: 50
        }), {
            text: '船舶名称',
            dataIndex: 'ShipName',
            flex:1
        }, {
            text: '状态名称',
            dataIndex: 'StateName',
            width: 150
        }, {
            text: '吨位',
            dataIndex: 'Tonnage',
            width: 150
        }, {
            text: '核载人数',
            dataIndex: 'LoadNumber',
            width: 150
        }
    ]
});

 

1.1.3 结构图

图片 4

 

1.4 服务器再次回到的数据格式

在此地shipMgrStore接收的是json格式的数码:

{"success":true,
"rowCount":100,
"data":[
{"ShipId":"989f1ace-5961-46d4-8f93-b56decb893af","ShipName":"船舶1","StateName":"离线","Tonnage":1.0,"LoadNumber":1},
{"ShipId":"f4dc1dd9-a173-4822-b3d3-4b3caa12820b","ShipName":"船舶2","StateName":"在线","Tonnage":1.0,"LoadNumber":1},
{"ShipId":"7b33d073-412b-460d-8e43-4f2d061d39a0","ShipName":"船舶3","StateName":"在线","Tonnage":2.0,"LoadNumber":2},
{"ShipId":"6ad72f6d-a4e6-4637-ab8b-038b9a7fc1b1","ShipName":"船舶4","StateName":"离线","Tonnage":3.0,"LoadNumber":3},
{"ShipId":"c3614867-a722-4ca8-961f-1324d5da4ad2","ShipName":"船舶5","StateName":"在线","Tonnage":1.0,"LoadNumber":4},
{"ShipId":"526befcf-0202-45b6-8175-4ca29a698acb","ShipName":"船舶6","StateName":"在线","Tonnage":5.0,"LoadNumber":1},
{"ShipId":"058295b4-e4d6-4fb6-b232-ed0e07515571","ShipName":"船舶7","StateName":"离线","Tonnage":6.0,"LoadNumber":6}
]}

 

1.2 原理

1.5 运行图

图片 5

 

1.2.1 步骤表达

切实的操作是本着tr成分,步骤如下:

1)
比较第行tr与第行tr的某部td的值,若两行的值非凡:设置第行tr的td的rowspan属性的值+1;设置第行tr的td隐藏。

2)
比较第行tr与第行tr的有些td的值,若两行的值万分:设置第行tr的td的rowspan属性的值+1;设置第行tr的td隐藏。

3)
重复下面的步调,若两行的值不等于,就跳过此次比较,实行下叁遍比较:当前行与下一行进行相比较。

2. 多少查询

查询功用相比较容易,只要求shipMgrStore在历次请求时增大上查询条件。

1.2.2 示例

1)
tr1与tr2相比,两者值非凡:设置tr1的rowspan属性的值+1;设置第tr2的td隐藏。

图片 6

2) tr1与tr3比较,两者值分外:设置tr1的rowspan属性的值+1;设置第tr3的td隐藏。

图片 7

3)
tr1与tr4相比较,两者的td不对等。跳过此次相比,进行下1回相比较:tr4与tr5相比较(当前行与下一行举行相比较)。

图片 8

 

2.1 创造1个搜索框

先是在shipMgrGrid的上边工具栏处创设三个文件输入框和1个询问按钮。

点击查询按钮,会触发shipMgrStore.loadPage(1)事件:

// 创建工具条
var shipMgrToolBarPanel = Ext.create('Ext.panel.Panel', {
    width: '100%',
    height: 40,
    bodyBorder: false,
    border: false,
    region: 'north',
    tbar: [
        Ext.create('Ext.form.field.Text', {
            name: 'SearchTxt',
            emptyText: '请输入船舶名称',
            width: 200,
            enableKeyEvents: true,
            listeners: {
                keyup: function (thisControl, e, eOpts) {
                    if (e.button == 12) {  // 若敲的键为回车,就执行【查询】搜索
                        shipMgrToolBarPanel.down('[name=QueryBtn]').handler();
                    }
                }
            }
        }),
        Ext.create('Ext.Action', {
            icon: 'Resources/icon/find.png',
            text: '查询',
            name: 'QueryBtn',
            handler: function () {
                // 设置搜索条件
                searchConditionObj.SearchTxt = shipMgrToolBarPanel.down('[name=SearchTxt]').value;
                shipMgrStore.loadPage(1);
            }
        })
    ]
});

 

2. 多列合并

Gird的集合可分为单列合并和多列合并,在那之中多列合并可分为三种:

首先种:每个列合并。

第两种:相同列合并。

2.2. store附加搜索条件

shipMgrStore每趟请求时都增大搜索条件:

// 创建store
var shipMgrStore = Ext.create('Ext.data.Store', {
    model: 'App.ShipMgr.model.ShipModel',
    pageSize: 25,
    autoLoad: true,
    proxy: {
        type: 'ajax',
        url: '/Business/ShipMgr/Query',
        reader: {
            reader: 'json',
            root: 'data',
            totalProperty: 'rowCount',
        },
        actionMethods: {
            create: 'Post'
        }
    },
    listeners: {
        beforeload: function (thisStore, record, opts) {
            // 附加检索条件
            thisStore.proxy.extraParams = searchConditionObj;
        }
    }
});

 

 

2.1 每一种列合并

说明:每一种列在近日列合并的前提下可各自合并。

示例

图片 9

 

2.3 运行图

图片 10

 

2.2 全体列合并

说明:唯有附近tr所钦点的td都平等才会进行统一。

示例

图片 11

 

3. 在线演示

在线演示http://www.akmsg.com/ExtJS/index.html#App.ShipMgr.ShipMgrTab

 

End

Web开发之路连串小说

菜单加载中…

3. 代码与在线演示

3.1 代码

/**
* 合并Grid的数据列
* @param grid {Ext.Grid.Panel} 需要合并的Grid
* @param colIndexArray {Array} 需要合并列的Index(序号)数组;从0开始计数,序号也包含。
* @param isAllSome {Boolean} 是否2个tr的colIndexArray必须完成一样才能进行合并。true:完成一样;false:不完全一样
*/
function mergeGrid(grid, colIndexArray, isAllSome) {
    isAllSome = isAllSome == undefined ? true : isAllSome; // 默认为true

    // 1.是否含有数据
    var gridView = document.getElementById(grid.getView().getId() + '-body');
    if (gridView == null) {
        return;
    }

    // 2.获取Grid的所有tr
    var trArray = [];
    if (grid.layout.type == 'table') { // 若是table部署方式,获取的tr方式如下
        trArray = gridView.childNodes;
    } else {
        trArray = gridView.getElementsByTagName('tr');
    }

    // 3.进行合并操作
    if (isAllSome) { // 3.1 全部列合并:只有相邻tr所指定的td都相同才会进行合并
        var lastTr = trArray[0]; // 指向第一行
        // 1)遍历grid的tr,从第二个数据行开始
        for (var i = 1, trLength = trArray.length; i < trLength; i++) {
            var thisTr = trArray[i];
            var isPass = true; // 是否验证通过
            // 2)遍历需要合并的列
            for (var j = 0, colArrayLength = colIndexArray.length; j < colArrayLength; j++) {
                var colIndex = colIndexArray[j];
                // 3)比较2个td的列是否匹配,若不匹配,就把last指向当前列
                if (lastTr.childNodes[colIndex].innerText != thisTr.childNodes[colIndex].innerText) {
                    lastTr = thisTr;
                    isPass = false;
                    break;
                }
            }

            // 4)若colIndexArray验证通过,就把当前行合并到'合并行'
            if (isPass) {
                for (var j = 0, colArrayLength = colIndexArray.length; j < colArrayLength; j++) {
                    var colIndex = colIndexArray[j];
                    // 5)设置合并行的td rowspan属性
                    if (lastTr.childNodes[colIndex].hasAttribute('rowspan')) {
                        var rowspan = lastTr.childNodes[colIndex].getAttribute('rowspan') - 0;
                        rowspan++;
                        lastTr.childNodes[colIndex].setAttribute('rowspan', rowspan);
                    } else {
                        lastTr.childNodes[colIndex].setAttribute('rowspan', '2');
                    }
                    // lastTr.childNodes[colIndex].style['text-align'] = 'center';; // 水平居中
                    lastTr.childNodes[colIndex].style['vertical-align'] = 'middle';; // 纵向居中
                    thisTr.childNodes[colIndex].style.display = 'none';
                }
            }
        }
    } else { // 3.2 逐个列合并:每个列在前面列合并的前提下可分别合并
        // 1)遍历列的序号数组
        for (var i = 0, colArrayLength = colIndexArray.length; i < colArrayLength; i++) {
            var colIndex = colIndexArray[i];
            var lastTr = trArray[0]; // 合并tr,默认为第一行数据
            // 2)遍历grid的tr,从第二个数据行开始
            for (var j = 1, trLength = trArray.length; j < trLength; j++) {
                var thisTr = trArray[j];
                // 3)2个tr的td内容一样
                if (lastTr.childNodes[colIndex].innerText == thisTr.childNodes[colIndex].innerText) {
                    // 4)若前面的td未合并,后面的td都不进行合并操作
                    if (i > 0 && thisTr.childNodes[colIndexArray[i - 1]].style.display != 'none') {
                        lastTr = thisTr;
                        continue;
                    } else {
                        // 5)符合条件合并td
                        if (lastTr.childNodes[colIndex].hasAttribute('rowspan')) {
                            var rowspan = lastTr.childNodes[colIndex].getAttribute('rowspan') - 0;
                            rowspan++;
                            lastTr.childNodes[colIndex].setAttribute('rowspan', rowspan);
                        } else {
                            lastTr.childNodes[colIndex].setAttribute('rowspan', '2');
                        }
                       // lastTr.childNodes[colIndex].style['text-align'] = 'center';; // 水平居中
                        lastTr.childNodes[colIndex].style['vertical-align'] = 'middle';; // 纵向居中
                        thisTr.childNodes[colIndex].style.display = 'none'; // 当前行隐藏
                    }
                } else {
                    // 5)2个tr的td内容不一样
                    lastTr = thisTr;
                }
            }
        }
    }
}

  

3.2 在线演示

在线演示http://www.akmsg.com/ExtJS/index.html#App.Demo.MergeGridTab

 

End

Web开发之路连串小说

食谱加载中…