依赖于angular的table组件

组件实现了以下功能

1. 列宽可动态拖动

2. 列数据排序

3. 列过滤

4. 列位置自由调整

除了需要引入angular.js(我用的是1.4.6版本),还需要引用一个angular衍生出来的插件ngdraggable.js

插件地址:https://github.com/fatlinesofcode/ngDraggable/blob/master/example.html

为了方便,我直接全部放在页面上展示吧

<body ng-app="myApp">
<div>
    <div ng-controller="myCon">
        <table id="myTab" cellspacing="0" cellpadding="2" border="1" style="text-align:center;table-layout: fixed;">
            <thead>
                <tr>
                    <th width="50">序号</th>
                    <th width="{{head.width}}" ng-repeat="head in headList">{{head.value}}</th>
                </tr>
                <tr>
                    <th width="50"></th>
                    <th width="{{head.width}}" ng-repeat="head in headList"><input style="width:80px;" type="text" ng-model="filterInput[head.code]" ng-change="filtrate(filterInput[head.code],head.code)" /></th>
                </tr>
            </thead>
            <tbody>
                <tr ng-repeat="data in tableData">
                    <td width="50">{{$index}}</td>
                    <td width="{{head.width}}" ng-repeat="head in headList" repeat-finish>{{data[head.code]}}</td>
                </tr>
            </tbody>
        </table>
        <p>
            <button ng-click="sort(‘name‘)">姓名排序</button>
            <button ng-click="sort(‘sex‘)">性别排序</button>
            <button ng-click="sort(‘age‘)">年龄排序</button>
            <button ng-click="sort(‘from‘)">籍贯排序</button>
            <button ng-click="sort(‘like‘)">爱好排序</button>
        </p>
        <br />
        <br />
        <p>下面可以拖拽排序(table列排序)</p>
        <ul>
            <li ng-repeat="head in headList" ng-drop="true" ng-drop-success="onDropComplete($index, $data,$event)" style="cursor:pointer;">
                <p ng-drag="true" ng-drag-data="head">{{head.value}}</p>
            </li>
        </ul>
    </div>
</div>
<script src="angular.js"></script>
<script src="ngDraggable.js"></script>
<script>
var headList = [
    {code:"name",value:"姓名",width:"150"},
    {code:"sex",value:"性别",width:"150"},
    {code:"age",value:"年龄",width:"150"},
    {code:"from",value:"籍贯",width:"150"},
    {code:"like",value:"爱好",width:"200"}
]
var tableData = [
    {name:"老王",age:25,sex:"男",from:"隔壁",like:"FQ"},
    {name:"小明",age:18,sex:"男",from:"山东",like:"游泳、爬山"},
    {name:"吴樊",age:3,sex:"男",from:"广东",like:"看书"},
    {name:"科比",age:45,sex:"男",from:"美国",like:"打篮球"},
    {name:"纪鲅强",age:25,sex:"不详",from:"火星",like:"聊天"},
    {name:"敏怡",age:23,sex:"女",from:"广东",like:"看书"},
    {name:"貂蝉",age:25,sex:"女",from:"洛阳",like:"弹琴"},
    {name:"姜子牙",age:85,sex:"男",from:"河南",like:"钓鱼"},
    {name:"小丸子",age:24,sex:"女",from:"日本",like:"吃东西"}
]
var sortData = {name : "+",sex : "+",age : "+",from : "+",like : "+"}

var app = angular.module(‘myApp‘, [‘ngDraggable‘]);
app.controller(‘myCon‘,["$scope","$filter",function($scope,$filter){
    var table = {
        init : function(){      //初始化
            $scope.headList = headList;
            $scope.tableData = tableData;
            $scope.sortData = sortData;
            $scope.filterInput = {};
            $scope.stretch = this.stretch;
            $scope.onDropComplete = this.onDropComplete;
            $scope.filtrate = this.filtrate;
            $scope.sort = this.sort;
        },
        onDropComplete : function (index, obj, evt) {   //拖拽排序方法
            var otherObj = $scope.headList[index];
            var otherIndex = $scope.headList.indexOf(obj);
            $scope.headList.splice(otherIndex,1);
            $scope.headList.splice(index,0,obj);
        },
        filtrate : function(value,code){    //列过滤方法
            $scope.tableData = tableData;
            switch(code){
                case ‘name‘ : $scope.tableData = $filter(‘filter‘)($scope.tableData,{name : value}); break;
                case ‘sex‘ : $scope.tableData = $filter(‘filter‘)($scope.tableData,{sex : value}); break;
                case ‘age‘ : $scope.tableData = $filter(‘filter‘)($scope.tableData,{age : value}); break;
                case ‘from‘ : $scope.tableData = $filter(‘filter‘)($scope.tableData,{from : value}); break;
                case ‘like‘ : $scope.tableData = $filter(‘filter‘)($scope.tableData,{like : value}); break;
            }
        },
        sort : function(row){   //列排序方法
            var sort = $scope.sortData[row];
            var val = sort + row;
            $scope.tableData = $filter(‘orderBy‘)($scope.tableData,val);
            if(sort == "+"){
                $scope.sortData[row] = "-"
            }else{
                $scope.sortData[row] = "+"
            }
        },
        stretch : function(){   //列宽度调整方法
            var myTAbId = document.getElementById("myTab");
            var tTD; //用来存储当前更改宽度的Table Cell,避免快速移动鼠标的问题
            var wData = {};
            var unset = myTAbId.rows[0].cells.length - $scope.headList.length;//不在headList遍历的列数
            for (var j = 0; j < myTAbId.rows[0].cells.length; j++) {
                myTAbId.rows[0].cells[j].index = j;
                if(unset - 1<j){
                    myTAbId.rows[0].cells[j].onmousedown = function (event) {
                        //记录单元格
                        tTD = this;
                        if (event.offsetX > tTD.offsetWidth - 10) {
                            tTD.mouseDown = true;
                            tTD.oldX = event.clientX;
                            tTD.oldWidth = tTD.offsetWidth;
                        }
                    };
                    myTAbId.rows[0].cells[j].onmouseup = function (event) {
                        //结束宽度调整
                        if (tTD == undefined) tTD = this;
                        tTD.mouseDown = false;
                        tTD.style.cursor = ‘default‘;
                        $scope.headList[this.index-unset].width = tTD.width;
                    };
                    myTAbId.rows[0].cells[j].onmousemove = function (event) {
                        //更改鼠标样式
                        if (event.offsetX > this.offsetWidth - 10)
                        this.style.cursor = ‘col-resize‘;
                        else
                        this.style.cursor = ‘default‘;
                        //取出暂存的Table Cell
                        if (tTD == undefined) tTD = this;
                        //调整宽度
                        if (tTD.mouseDown != null && tTD.mouseDown == true) { 

                            tTD.style.cursor = ‘default‘;
                            if (tTD.oldWidth + (event.clientX - tTD.oldX)>0)
                            tTD.width = tTD.oldWidth + (event.clientX - tTD.oldX);
                            //调整列宽
                            // tTD.style.width = tTD.width;
                            tTD.style.cursor = ‘col-resize‘;
                            //调整该列中的每个Cell
                            myTAbId = tTD; while (myTAbId.tagName != ‘TABLE‘) myTAbId = myTAbId.parentElement;
                            for (var k = 0; k < myTAbId.rows.length; k++) {
                                myTAbId.rows[k].cells[tTD.cellIndex].width = tTD.width;
                            }
                        }
                    };
                }
            }
        }
    }
    table.init();
}]);

app.directive(‘repeatFinish‘,[function(){
     return {
        link: function($scope,$element,$attr){
            if($scope.$last == true){
                $scope.stretch();
            }
        }
    };
}]);

</script>
</body>

小生刚入门angular不久,所以有什么写的不好的地方,请各位大神指出

时间: 2024-10-20 12:27:14

依赖于angular的table组件的相关文章

Angular动态创建组件之Portals

这篇文章主要介绍使用Angular api 和 CDK Portals两种方式实现动态创建组件,另外还会讲一些跟它相关的知识点,如:Angular多级依赖注入.ViewContainerRef,Portals可以翻译为 门户 ,我觉得放到这里叫 入口 更好,可以理解为动态创建组件的入口,类似于小程序或者Vue中的Slot. cdk全名Component Development Kit 组件开发包,是Angular官方在开发基于Material Design的组件库时抽象出来单独的一个开发包,里面

React中使用Ant Table组件

一.Ant Design of React http://ant.design/docs/react/introduce 二.建立webpack工程 webpack+react demo下载 项目的启动,参考 三.简单配置 1.工程下载下来之后,在src目录下新建目录“table”,新建app.js,内容如下. import React from 'react'; import ReactDOM from 'react-dom'; import ExampleTable from './Exam

使用 antd Table组件, 异步获取数据

使用React.js + Redux + antd 制作CMS 后台内容管理系统,分享一点点积累,欢迎讨论. 在this.state中初始化数据: this.state = { pageNum:1, /*翻页查询*/ pageSize:10, /*分页查询*/ activePage: 1, /*默认显示一页*/ selectedRowKeys: [], // 这里配置默认勾选列 loading: false, /*antd*/ selectedRow:[] } 在制作过程中,根据需要把antd的

关于MUI v0.18.0版本 Table组件里的复选框不能选的解决方案

前段时间在用MUI的时候,Table组件出现复选框不能选的bug(描述: 点击复选框,点击事件会触发,复选框勾选状态无变化). 解决方法: 用CheckBox组件代替Table组件自带的复选框. 解决思路: 1.将CheckBox分为两种,一种是表头里的全选框(以下称全选框),一种是列表行里普通的复选框(以下称普通框): 2.将普通框进行单独封装(原因: 1.便于单个普通框自己管理自己的勾选状态,2.当全选框的勾选状态发生变化时,可以通过props将全选框的状态赋给它,从而实现全选的功能): 关

Ant Table组件

http://www.cnblogs.com/hujunzheng/p/5689650.html React中使用Ant Table组件 v一.Ant Design of React http://ant.design/docs/react/introduce v二.建立webpack工程 webpack+react demo下载 项目的启动,参考 v三.简单配置 1.工程下载下来之后,在src目录下新建目录“table”,新建app.js,内容如下. import React from 're

ireport5.6使用table组件,如何用table显示javaBean数据源

1.从组件面板添加一个table组件到报表中. 2.设计table的字段头. 合并操作 1. 2. 删除你不需要的列 新增你的合并列 3.在报表Parameters里新增一个参数dets(java.util.List) 4.配置table数据集 a.重命令数据集(方便) 右键->属性,即可修改. b.添加一个Parameters 新增一个table1(net.sf.jasperreports.engine.JRDataSource) c.手动配置代码,把dets参数传递给table1接收 <d

angular 有关侦测组件变化的 ChangeDetectorRef 对象

我们知道,如果我们绑定了组件数据到视图,例如使用 <p>{{content}}</p>,如果我们在组件中改变了content的值,那么视图也会更新为对应的值. angular 会在我们的组件发生变化的时候,对我们的组件执行变化检测,如果检测到我们的数据发生了变化,就会执行某些操作,如修改绑定数据的时候更新视图. 这样一来,当我们的组件数据比较多的时候,angular就会有很多操作在静悄悄地进行,一个规避这个问题的方法是,设置某个组件的变化检测策略为 'OnPush'. 使用 OnP

微信小程序简易table组件实现

前提:微信小程序自1.6.3基础库版本库开始支持简洁组件,之前的版本因不支持,故在引用组件处默认为空节点.关于微信小程序已有模板为何还需构建组件?一是因为组件可以更方便的自定义并绑定行为,二是在其他页面引用时,无需通过import,只需在该页面json文件下配置usingComponents属性即可.(原本想在app.json文件里配置这个属性,从此一劳永逸,但目前貌似还不支持,至少我尝试的时候还不行-.-) 思路:主要是将table的head和tbody部分的数据抽象出来,使之只需要传值就可直

Element ui 中使用table组件实现分页记忆选中

我们再用vue和element-ui,或者其他的表格的时候,可能需要能记忆翻页勾选,那么实现以下几个方法就ok了 首先定义个data值 data () { return { multipleSelectionAll: [], // 所有选中的数据包含跨页数据 idKey: 'personId' // 标识列表数据中每一行的唯一键的名称(需要按自己的数据改一下) } } 方法中定义以下: methods : { // 设置选中的方法 setSelectRow() { if (!this.multi