首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

如何样用扩展的方式来扩展OperaMasksUI的grid

2012-08-27 
怎么样用扩展的方式来扩展OperaMasksUI的grid前面我写了一篇文章来扩展OpreaMasksUI的grid的排序功能和显

怎么样用扩展的方式来扩展OperaMasksUI的grid

前面我写了一篇文章来扩展OpreaMasksUI的grid的排序功能和显示详情的功能,不清楚的可以看下我博客的另外一篇文章:http://dingchao-lonton.iteye.com/admin/blogs/1345088,但是我修改的时候污染了原来的代码,我觉得这种方式很不好,所以我就用jquery ui的widget factory提供的继承方式来扩展,这样原来的代码可以保持干净;

?

javasscript代码如下:

?

?

/* * $Id: om-grid.js,v 1.97 2012/01/04 03:28:04 zhoufazhi Exp $ * operamasks-ui omGrid @VERSION * * Copyright 2011, AUTHORS.txt (http://ui.operamasks.org/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://ui.operamasks.org/license * * http://ui.operamasks.org/docs/ *  * Depends: *  jquery.ui.widget.js *  jquery.ui.core.js *  jquery.ui.mouse.js *  jquery.ui.resizable.js *  om-grid.js */ /**     * @name omGridExtend     * @author ding chao     * @class 表格组件。扩展自om.omGrid,增加了排序和显示详情功能<br/><br/>     * <b>示例:</b><br/>     * <pre>     * &lt;script type="text/javascript" >     *   $('#grid').omGridExtend({ *//是否显示详情 *showDetail:true, *singleSelect:false,     *          dataSource : 'griddata.do?method=fast',     *           colModel : [ {header : 'ID', name : 'id', width : 100, align : 'center'},      *                        {header : '地区', name : 'city', width : 120, align : 'center'},      *                        {header : '地址', name : 'address', align : 'center', width : 'autoExpand'} ],     *onRowClick:function(index,row){ * *}, *onRowSelect:function(){ * *}, *onRowDeselect:function(){ * *}, *//当详情展开的时候调用的回调 *onDetailExpand:function(rowData,row){ * *}, *//初始化的时候以哪一个字段排序 *sortName:'address', *//排序方式 *sortOrder:'desc', *method:'get', *onRowCheck:function(index){ * *}     *      });     * &lt;/script>     *      * &lt;table id="mytable"/>     * </pre>     *      */;(function($) {    $.widget('om.omGridExtend',$.om.omGrid, {        options:/** @lends omGridExtend#*/{/**  *是否显示详情  *@default false  *@type Boolean  *@example  *$('.selector').omGrid({showDetail : false});  */showDetail:false,/**  *详情展开的时候是否重新加载  *@default true  *@type Boolean  *@example  *$('.selector').omGrid({detailExpandReload : false});  */detailExpandReload:true,            /**  *详情展开时候的回调函数  *@default function(rowData,detailContainer){}  *@type Function  *@example  *$('.selector').omGrid({onDetailExpand : function(rowData,detailContainer){}});  */onDetailExpand : function(rowData,detailContainer){},/**  *初始化的时候以哪个字段作为排序字段  *@default null  *@type String  *@example  *$('.selector').omGrid({sortName : 'address'});  */sortName:null,/**  *排序方式  enmu{"desc","asc"}  *@default asc  *@type String  *@example  *$('.selector').omGrid({sortName : 'address'});  */sortOrder:'asc'        },        //private methods        _create:function(){//call super method$.om.omGrid.prototype._create.call(this);            this._bindHeadClickEnvent();this._bindDetailEvent();        },        _buildTableHead:function(){            var op=this.options,                el=this.element,                grid = el.closest('.om-grid'),                cms=op.colModel,                allColsWidth = 0, //colModel的宽度                indexWidth = 0, //colModel的宽度                checkboxWidth = 0, //colModel的宽度                autoExpandColIndex = -1;                thead=$('<thead></thead');                tr=$('<tr></tr>').appendTo(thead);this.detailColSpan = 0;//渲染显示明细列if(op.showDetail){var cell = $('<th></th>').attr({axis:'detailCol',align:'center'}).addClass('unsort detailCol').append($('<div style="text-align:center;width:25px;"></div'));tr.append(cell);                indexWidth=25;this.detailColSpan++;}            //渲染序号列            if(op.showIndex){                var cell=$('<th></th').attr({axis:'indexCol',align:'center'}).addClass('unsort indexCol').append($('<div style="text-align:center;width:25px;"></div'));                tr.append(cell);                indexWidth=25;this.detailColSpan++;            }            //渲染checkbox列            if(!op.singleSelect){                var cell=$('<th></th').attr({axis:'checkboxCol',align:'center'}).addClass('unsort checkboxCol').append($('<div style="text-align:center;width:17px;"><span cellSpacing="0"></table></div>');            el.parent().before(hDiv);                            $('table',hDiv).append(thead);            //修正各列的列宽            if(autoExpandColIndex != -1){ //说明有某列要自动扩充                var tableWidth=grid.width()-20,                    //usableWidth=tableWidth-allColsWidth-indexWidth-checkboxWidth;                    usableWidth=tableWidth-thead.width();                    toBeExpandedTh=tr.find('th[axis="col'+autoExpandColIndex+'"] div');                if(usableWidth<=0){                    toBeExpandedTh.css('width',60);                }else{                    toBeExpandedTh.css('width',usableWidth);                }            }else if(op.autoFit){                //var tableWidth=el.width(),                 //   usableWidth=tableWidth-indexWidth-checkboxWidth;                var tableWidth=grid.width()-20,                    usableWidth=tableWidth-thead.width(),                    percent=1+usableWidth/allColsWidth,                    toFixedThs=tr.find('th[axis^="col"] div');                for (var i=0,len=cms.length;i<len;i++) {                    var col=toFixedThs.eq(i);                    col.css('width',parseInt(col.width()*percent));                }            }            this.thead=thead;            thead = null;        },_bindHeadClickEnvent:function(){var self = this,op = this.options;this.thead.delegate('th:not(.unsort)','click',function(event){var abbr = $(this).attr('abbr');op.sortName = abbr;$('th>div',self.thead).removeClass('sasc').removeClass('sdesc');op.sortOrder === 'asc' ? (op.sortOrder = 'desc',$('>div',this).addClass('sdesc')):(op.sortOrder = 'asc',$('>div',this).addClass('sasc'));self._populate();}); },_renderDatas:function(from,to){            var self=this,                el=this.element,                op=this.options,                grid=el.closest('.om-grid'),                gridHeaderCols=$('.hDiv thead tr:first th',grid),                rows=this.pageData.data.rows,                colModel=op.colModel,                rowClasses=op.rowClasses,                tbody=$('tbody',el).empty(),                isRowClassesFn= (typeof rowClasses === 'function'),                pageData = this.pageData,start=(pageData.nowPage-1)*op.limit;            $.each(rows,function(i, rowData) {                var rowCls = isRowClassesFn? rowClasses(i,rowData):rowClasses[i % rowClasses.length];                var tr=$('<tr></tr>').addClass('om-grid-row').addClass(rowCls).attr('rowindex',i);                var rowValues=self._buildRowCellValues(colModel,rowData,i);                $(gridHeaderCols).each(function(){                    var axis = $(this).attr('axis'),wrap=false,html;if(axis == 'detailCol'){ html = '<span name="code"><!DOCTYPE html><html><head>    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">    <title>基本功能</title>    <script type="text/javascript" src="../../jquery.js"></script>    <script src="../../ui/jquery.ui.core.js"></script>    <script src="../../ui/jquery.ui.widget.js"></script>    <script src="../../ui/jquery.ui.mouse.js"></script>    <script src="../../ui/jquery.ui.resizable.js"></script>    <script type="text/javascript" src="../../ui/om-grid.js"></script><script type="text/javascript" src="../../ui/om-grid-extend.js"></script>    <link rel="stylesheet" type="text/css" href="../../themes/default/om-all.css" />    <link rel="stylesheet" type="text/css" href="../common/css/demo.css" />    <!-- view_source_begin -->    <script type="text/javascript">        $(document).ready(function() {            $('#grid').omGridExtend({//是否显示详情showDetail:true,singleSelect:false,                dataSource : 'griddata.do?method=fast',                colModel : [ {header : 'ID', name : 'id', width : 100, align : 'center'},                              {header : '地区', name : 'city', width : 120, align : 'center'},                              {header : '地址', name : 'address', align : 'center', width : 'autoExpand'} ],onRowClick:function(index,row){},onRowSelect:function(){},onRowDeselect:function(){},//当详情展开的时候调用的回调onDetailExpand:function(rowData,row){},//初始化的时候以哪一个字段排序sortName:'address',//排序方式sortOrder:'desc',method:'get',onRowCheck:function(index){}            });        });    </script>    <!-- view_source_end --></head><body>    <!-- view_source_begin -->    <table id="grid"></table>    <!-- view_source_end -->    <input type = "button" id = "get" value ="get" >    <div id="view-desc">        设置dataSource和colModel属性,在table元素中渲染表格。    </div></body></html>
1 楼 mfkvfn 2012-02-02   这样做比较好。其实排序功能是比较常见的,之所以我们没把排序做到omGrid中去,是因为我们设计时这个omGrid是一个基础组件,将作为其它grid组件的基类。而有些grid是不可以排序的,比如treeGrid(演示例见http://demo.operamasks.org/bpdemos/index.faces?userdata=treeGrid)、分组统计表格(演示示例见http://demo.operamasks.org/bpdemos/index.faces?userdata=groupSummaryGrid)、统计表格(演示示例见http://demo.operamasks.org/bpdemos/index.faces?userdata=pivotGrid)。所以如果基类有这些功能的话,子类把它去掉不好。

所以设计时基类只有基本功能(所有子类都有的),其它功能由子类(或者插件)来提供。
像你做的可展开表格的效果与http://demo.operamasks.org/bpdemos/index.faces?userdata=expanderGridPlug是一样的。

整个组件的体系与继承机制我们也已经讨论过了,直接的继承并不好,比如A的两个子类A1和A2,A1提供功能1,A2提供功能2,那么如果我同时要A1和A2功能怎么办?再做一个A3同时提供功能1和功能2?那这样功能一多就会产生组合爆炸了。所以我们推荐以插件的机制来做,就类似于《设计模式》中的“Decorator装饰模式”模式这种。 2 楼 mfkvfn 2012-02-02   1.0之后的版本我们会陆续做一些grid或其它组件的插件(或子类)。

你做的这些功能值得参考。我们正在考虑一种贡献机制,大致是“贡献者自己完成基本功能,然后申请合并到主干,我们进行审核,如果采纳了,就将代码合并进来,由我们进行维护,并在文档显要位置标注贡献者的名字。如果某贡献者多次贡献重要代码,我们将把贡献者加入开发人员组中,与我们开发人员享有同等权利(可以直接提交代码到主干,可以参与Bug修复、测试、发版、文档等工作,可以收到日常工作邮件,可以查看日常内部交流资料等)”。具体细节还在制定中。近期可能会把代码托管到GitHub上,然后采用这种贡献机制。

热点排行