ExtJS 4.2 Grid组件的特元格合并

by admin on 2018年12月15日

ExtJS 4.2 Grid组件本身并不曾供单元格合并功用,需要协调实现那么些效果。

以高速开发进程中,大家尚需针对网架构举办设计啊?事实上,马丁 Fowler在《Is Design Dead?》一温柔碰到已给有了答案,那就是我们同样未可知忽视对系统架构的筹划。与设计的规划(Planned Design)不同,大家需要演进式的统筹(Evolutionary Design)。

 目录

  1. 原理

2.
基本上排合并

3.
代码和在线演示

 

IBM’s Methods Group的飞专家司各脱 W. Ambler提议了“架构预测(Architectural Envisioning)”的主意,以承诺针对急忙开发被逐年演进的架构设计过程。

1. 原理

斯科特(Scott)(Scott)提议,敏捷模型驱动开发(Agile Model Driven Development,英特尔D)明确地包括了起需求分析及架构建模,这多少个进程有在高速项目支出之第0次迭代中。

1.1 HTML代码分析

先是创造一个Grid组件,然后查下的HTML源码。

图片 1

1.1.1 Grid组件

图片 2

 

1.1.2 HTML代码

图片 3

打那一个代码中可见见,Grid组件可分为grid-header和grid-body
两片区域(若含工具栏和分页栏,它们还会师蕴藏各自的独门区域)。

里grid-body包含了多tr元素,每一个tr都是意味着Grid组件中的一行数;每个tr内部还带有了广大td,每个td表示一个单元格。

经对架构的估量,可以当品种初期举行局部强层次之架构建模,以助于团队以及根本利益相关人研讨系统以的技术政策。这无异于作为之根本目的是甄别出架构策略,而无是编而山一般堆积的文档,从而使得你能够快完成架构建模。

1.1.3 结构图

图片 4

 

 

1.2 原理

搭建模是贯通于一体项目周期的,由此那个图(技术图纸,用户交互流程图,领域图,变更处境)就是以品种竣工时形成的总体文档的根基。由于您先明确架构是形成的,因而就无需负担架构设计在档次中期必须“正确是”的下压力,而独待以眼前事势下保证丰富好就得了。

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)
重复上边的步骤,若两举行之价值未等于,就跳了本次相比,举行下一样涂鸦相比较:当前行及生一行举办比。

 

1.2.2 示例

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

图片 5

2) tr1与tr3相比,两者值至极:设置tr1的rowspan属性的值+1;设置第tr3之td隐藏。

图片 6

3)
tr1与tr4相比,两者的td不对等。跳了本次相比,举行下同样不良比:tr4与tr5相比较(当前实施与生一行举行较)。

图片 7

 

司各脱(Scott)指出,所谓的“架构预测”可以提供如下价值:

2. 大多排列合并

Gird的联合而分为单列合并和多列合并,其中大多排列合并而分为二种:

先是栽:逐个列合并。

次种:相同列合并。

 

2.1 逐个列合并

说明:每个列于头里列合并往日提下可分别合并。

示例

图片 8

 

◆提升生产力

2.2 全体排列合并

说明:只有附近tr所指定的td都同样才碰面举行合并。

示例

图片 9

 

 

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开发的路系列作品

菜单加载中…

◆减弱支出时间

 

◆增强联络

 

◆可伸缩的便捷软件开发。

 

用精晓的凡,这样的如出一辙种植架构预测方法,正好合乎高效开发迭代的内需。在品种支付早期,对网完全举办同样不成强层次之概览,并对重要作业要求举办辨认和析,划分合理之系统模块,有助于在迭代开销被呢协会成员建立一个联的科班及对象。而以历次迭代历程被,团队就是好对本次迭代里的遵从拓展深入之架构建模,然后通过TDD充足领会需要,对模块的底细进行统筹和落实。这是便捷架构设计的焦点操作原理,它与敏捷开发条件是一脉相承的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图