dtGrid插件集成到Angular环境实现表格化数据展现

00没有抱怨的世界

周末效率好低,两天没更了,看看这看看那,装了个win10发现触摸板驱动不适配,然后找了好久都不行,23333。

AngularJS用的时间很短,高级的用法有点吃不消了,$digest,$watch这种东西的原理看起来好吃力啊,后面还有大把大把的需求要用这个来做了#¥@%#@!

01.先看看效果吧

这里的所有数据相关信息都是直接配置到DB的,作为元数据,包括搜索条件,显示方式,数据过滤器等等,配置目前只实现了几个,加的配置越多,能适用的业务就越广。数据本身也是在DB的,在后台简单的实现了控制Collection级别CRUD权限的功能。

输入条件搜索之后:

dtGrid小广告^_^

AngularJS有一款非常好的表格插件Angular ui-grid。但是奈何在高墙之上,API不好找,于是本人找到了一款国内非常不错的表格插件DtGrid。这个插件是基于jQuery写的,而jQuery和Angular的兼容性又非常棒,于是稍加改造就可以用在Angular环境下了。

这里有详细的文档和实例,www.dtGrid.com

10.前端"实现"

html部分定义了一个<div ng-dt-grid id="user"></div>用于让Angular执行指令,默认的属性级指令等等参数都不用写了,直接link执行操作。实现打引号也是因为很多配置都没有实现,打算先把分页做了。

↑ 分割线 ↑
var comDirective = angular.module(‘comDirective‘, []);      //依赖这个模块的controller均会编译这条指令

comDirective.directive("ngDtGrid",function(){
    return {
        /* template : "<div id=‘toolbar‘></div>", //not a good impl */  //第一版,先实现多条件查询和展示,很多dtGrid附带的功能还没有完全移植,慢慢来
        link : function(scope, element, attrs, ctrl){
            $.post(‘/displayData/‘+ attrs.id,{},function(data){    //先去根据要显示的数据集去后台拿这个数据集的配置
                if(!!data._id) {
                    scope.metaData = data;
                    scope.data = [];
                    scope.init = true;
                    /**
                     * init data grid
                     * */
                    var dtGridColumns = [];

                    $.each(data.columns,function(obj){
                        dtGridColumns.push({
                            id:data.columns[obj].columnName,
                            title:data.columns[obj].displayName,
                            type: data.columns[obj].dataType == "date"? data.columns[obj].dataType : "string",
                            columnClass:‘text-center‘
                        });
                    });

                    var dtGridOption = {                    //dtGrid核心配置
                        lang : ‘zh-cn‘,
                        ajaxLoad : false,
                        datas : scope.data,
                        columns : dtGridColumns,
                        gridContainer : data._id,
                        pageSize : 20,
                        pageSizeLimit : [10, 20, 50]
                    };

                    scope.grid = $.fn.DtGrid.init(dtGridOption);   //显示到DOM上 (dtGrid 插件的用法 $.fn.DtGrid.init)
                    scope.grid.refresh();

                    $("#search-"+data._id).click(function(){        //定义的数据搜索条件的一些配置,比如这个搜索条件是字符串还是日期还是选择下拉框等等,这里提取搜索条件
                        var criteria = {};
                        $.each(data.columns,function(col){
                            if(data.columns[col].searchable) {
                                var fieldVal = null;
                                var fieldType = data.columns[col].dataType;
                                var colName = data.columns[col].columnName;
                                if(fieldType == ‘date‘) {
                                    var dateFrom = $("#"+data.columns[col].columnName + "From").val();
                                    var dateTo = $("#"+data.columns[col].columnName + "To").val();
                                    criteria[colName] = {};
                                    if(dateFrom.length != 0) criteria[colName].$gt =  new Date(dateFrom).getTime();
                                    if(dateTo.length != 0) criteria[colName].$lt =  new Date(dateTo).getTime();
                                } else {
                                    fieldVal = $("#"+data.columns[col].columnName).val().replace(/\s+/,"");
                                    if(fieldType == ‘array‘) {
                                        if(fieldVal.split(/[,|,|;|;]/).length != 0) {
                                            var optionsObj = [];
                                            var tempArray = fieldVal.split(/[,|,|;|;]/);
                                            for(var i = 0;i< tempArray.length;i++) {
                                                if(tempArray[i].trim().length != 0) {                                        var tempObj = {};                          tempObj[colName] = tempArray[i];
                                                       optionsObj.push(tempObj);              }
                                            }
                                            if(!criteria.$and) {
                                                criteria.$and = [];
                                            }
                                            if(optionsObj.length != 0)                                                criteria.$and.push({$or:JSON.stringify(optionsObj)});
                                        }
                                    } else if(fieldType instanceof Object) {
                                        if(fieldType.multiSelect) {
                                            //todo append $or options to $and property
                                            if(fieldVal.length != 0)
                                                criteria[colName] = fieldVal;
                                        } else {
                                            if(fieldVal.length != 0)
                                                criteria[colName] = fieldVal;
                                        }
                                    } else {
                                        if(fieldVal.length != 0)
                                            criteria[colName] = fieldVal;
                                    }
                                }
                            }
                        });
                        $.get("/collection/"+data._id,                 //数据接口,把MongoDB封装了REST接口,分页暂时还没实现,不要急,慢慢来
                            {where:criteria,option:{page:[0,20]}},
                            function(data) {

                                if(data instanceof Array) {
                                    scope.data = data;                   //把服务器返回的数据装到Grid里面去
                                    scope.grid.reload.apply(scope.grid);  //关键点!dtGrid的代码里是使用this来取数据集的,但是这里的this并不是scope.grid,apply一下
                                } else {
                                    //todo toast                          //错误处理还没有写啦啦啦,慢慢来
                                    alert(data);
                                }
                            }
                        );
                    });

                }
            });
        }
    }
});

02.后台"实现"

exports.findCollectionData = function(req,res){
    EasyMongo.find("meta",{_id:req.params.id},function(err,docs){
        if(err) res.send(mapping.errorCode.basicServerError);
        else {
            if(docs.length == 0) {
                res.send(mapping.errorCode.paramError);
            } else if(docs.length > 1){
                res.send(mapping.errorCode.dirtyDataError);
            } else {
                //todo option req.query.option
                EasyMongo.find(docs[0].collectionName,req.query.where || {},{},function(err,data){
                    if(err) res.send(mapping.errorCode.paramError);
                    else res.send(data);
                });
            }
        }
    });
};

嘿嘿,是不是很少。少的原因是大把大把的配置在元数据的逻辑还没有实现。。

先读取元数据配置,再查一把就OK,参数的生成方式在Angular指令中完成的,可以适应在MongoDB中。

这里的EasyMongo是笔者封装的一个MongoDB增删改查的接口,目前连接池好像有点爆炸,还在找原因。没有用Mongoose的原因是Mongoose其实是把数据接口hardcode在了Schema里面,而笔者想达到的效果是数据接口甚至业务逻辑本身也在数据库里面,对于不同的需求,只需增加一条BSON,找个写前端的,就完成了。把后端抽象出来,对于普通的CMS系统和较低复杂度系统是完全可以实现的。

11.这种才写几天的项目就不叫开源了,传送门->

https://git.oschina.net/code2life/SuperTurtle.git

笔者在某家公司实习,由于实习期快到并且不打算留下来,老大提了一个需求,基本是我自己想怎么实现怎么实现了。这个项目算是半公半私吧。

具体的代码在这里了,项目刚开始。欢迎添砖加码。

时间: 2024-10-25 09:46:39

dtGrid插件集成到Angular环境实现表格化数据展现的相关文章

eclipse集成Perl开发环境

在linux下是自带 Perl 环境的, 那么如何在windows下开发 Perl 呢? 相信是很多开发人员梦寐以求的事情. 本文教你在eclipse中安装 Perl 插件, 下面我们就跟着步骤一起做吧. 1. 首先安装window下的 Perl 环境: 下载地址:http://www.activestate.com/activeperl/downloads 文件名:ActivePerl-5.16.1.1601-MSWin32-x86-296175.msi 1.1  点击下载好的文件按提示一步一

eclipse集成Python开发环境

话说最近听说 Python 很牛, 很强大, 至于究竟有多强大, 俺作为一枚菜鸟也就不好发表太多评价. 言归正传, 本文教你在eclipse中安装 Python 插件, 下面我们就跟着步骤一起做吧. 1. 首先安装window下Python环境: 下载地址: https://www.python.org/downloads/ 我安装的是: python-3.4.0.msi 1.1  点击下载好的文件按提示一步一步安装 1.2 检测 Python 是否安装成功: 1.2.1 "开始" -

VS2010集成Qt5.2环境搭建

用了这么久的Qt,IDE一直都是VS与Creator并用(实际开发以VS为主),至于哪个更好这里不发表看法,各有所长,而且也因人而异,萝卜青菜,各有所爱. Qt5发布很久之后,才把版本从之前的4.8升级到5.1.现在5.2发布了,果断换上,先尝尝鲜.加上之前也一直有人问我关于VS与Qt的集成,在此一并记录... 环境:VS2010 + Qt5.2 关于VS的下载.安装,这里就不再做过多阐述. 一.下载Qt5.2安装包(qt-windows-opensource)与Qt插件(Visual Stud

atitit. applet 浏览器插件 控件 的环境,开发,提示总结o9o

atitit. applet 浏览器插件 控件 的环境,开发,提示总结o9o 1. 建立applet:: 1 2. Applet 码 1 3. Applet (awt)跟japplet (swing)的区别.. 1 4. Html 码 1 5. Applet部署:::class 跟个jar 到个weebroot 2 5.1. 导入在的jar ,也放得个weebroot 哈,,,多个jar 逗号分割 2 6. 安全机制排除 D:\jdk1.7.0_01\jre\lib\security\java.

Gvim各种插件配置(windows环境下)

1.Vundle插件:https://github.com/gmarik/Vundle.vim 用于管理Vim插件,安装此插件需要系统中已安装git,参考链接:Git for Windows安装和基本设置 在Vim/vimfiles路径下新建文件夹bundle,然后在此文件夹下克隆github上的vundel项目: 完成后会在bundle文件夹下看到Vundle.vim文件夹下的内容,开始配置vundle: 在.vimrc文件中添加如下代码: 1 filetype off 2 3 "Vundle

Sublime Text 3118 插件集成定制汉化方案--赵亮(碧海情天)

Sublime Text 3118 插件集成定制汉化方案–赵亮(碧海情天) 原创内容,转载请保留原作者完整姓名信息 前言 一晃,离最开始为Sublime Text写汉化和插件开发与发布的教程 http://blog.csdn.net/theforever/article/details/8962727,都已经过去三年了.这其间,我又写过几篇具体介绍自己汉化定制的Sublime Text从3056到3061的递进式方案,大家可以参考: http://my.oschina.net/theforeve

eclipse git 插件集成与本地使用

转http://blog.csdn.net/wisgood/article/details/12949131 1.集成插件 进入到插件集成功能,在输入框写入    Git - http://download.eclipse.org/egit/updates 点击add按钮,出现如下对话框 点击ok按钮出现以下对话框 只选择EGit的两个选项即可,点击next后等待 之后进入如下页面 点击next 以下界面选择接受,点击finish 开始安装 之后会提示重启eclipse,重启即可完成集成 如果长

在Bootstrap开发框架中使用dataTable直接录入表格行数据(2)--- 控件数据源绑定

在前面随笔<在Bootstrap开发框架中使用dataTable直接录入表格行数据>中介绍了在Web页面中使用Jquery DataTable插件进行对数据直接录入操作,这种处理能够给用户提供较好的数据录入体验,本篇继续上篇的内容,继续介绍这个直接录入的处理操作,主要涉及到控件的初始化和数据源的绑定等操作内容,随着对这个处理的深入了解,我发现可以控制的内容也更加丰富,能够更好的实现各种所需的效果. 1.直接录入数据的界面分析 在之前介绍的数据直接录入处理的时候,界面效果如下所示. 上面的界面处

使用 Chrome 浏览器插件 Web Scraper 10分钟轻松实现网页数据的爬取

本文标签: WebScraper Chrome浏览器插件 网页数据的爬取 使用Chrome 浏览器插件 Web Scraper 可以轻松实现网页数据的爬取,不写代码,鼠标操作,点哪爬哪,还不用考虑爬虫中的登陆.验证码.异步加载等复杂问题. Web Scraper插件 Web Scraper 官网中的简介: Web Scraper Extension (Free!)Using our extension you can create a plan (sitemap) how a web site