angular smart-table组件如何定制化之初步研究

table表运用在后台管理用得频繁,一般bootstrap的class="table"就能满足样式需求以及分页需求,但是每个产品经理需求不一样,比如说分页:bootstrap分页实现是这样子的

但原型要求这样子的

被推荐angular相关table组件smart-table算是功能相当全的,学习官网地址http://lorenzofox3.github.io/smart-table-website/#section-intro

看了一下,上手可以,但是要深入了解内容较难。调研smart-table主要是为了进一步在工作中完善之前的table表不足之处。比如涉及功能包括排序、搜索、分页、选中等等。

下面作为angular新手如何整合了smart-table和自定义的分页,当然,提升优化空间相当大!

实现的效果页:

首先下载smart-table,我用的bower: bower install angular-smart-table --save-dev

在index中引入相关文件,下面是我的index中引入的一些文件:

<!--angular文件-->
<script src="bower_components/angular/angular.js"></script>
<!--ui-route配置路由库文件-->
<script src="bower_components/angular-ui-router/release/angular-ui-router.js"></script>
<!--支持angular的动画库文件-->
<script src="bower_components/angular-animate/angular-animate.js"></script>
<!--smart-table库文件-->
<script src="bower_components/angular-smart-table/dist/smart-table.js"></script>
<!--按需加载库文件-->
<script src="bower_components/oclazyload/dist/ocLazyLoad.js"></script>
<!--支持angular的bootstrap库文件-->
<script src="src/js/ui-bootstrap-tpls.min.js"></script>
<!--bootstrap注入主应用文件-->
<script src="bootstrap.js"></script>
<!--smart-table测试功能文件夹的路由配置-->
<script src="smartTableTest/smartTable.route..js"></script>
<!--控制输入框数值directive-->
<script src="common/directive/my-max-number.js"></script>
<!--smart-table官网提供的示例directive,增加复选框按钮-->
<script src="common/directive/custom-select.js"></script>

smart-table.view.html

<table class="table" st-pipe="callServer" st-table="displayed">
    <thead>
    <tr>
        <th></th>
        <th st-sort="id">id</th>
        <th st-sort="name">name</th>
        <th st-sort="age">age</th>
        <th st-sort="saved">saved</th>
    </tr>
    <tr>
        <th></th>
        <th><input st-search="id" /></th>
        <th><input st-search="name" /></th>
        <th><input st-search="age" /></th>
        <th><input st-select="saved" /></th>
    </tr>
    </thead>
    <tbody ng-show="!isLoading">
    <tr ng-repeat="row in displayed">
        <td cs-select="row"></td>
        <td>{{row.id}}</td>
        <td>{{row.name}}</td>
        <td>{{row.age}}</td>
        <td>{{row.saved}}</td>
    </tr>
    </tbody>
    <tbody ng-show="isLoading">
    <tr>
        <td colspan="4" class="text-center">Loading...</td>
    </tr>
    </tbody>
    <tfoot>
    <tr>
        <td colspan="4" class="text-center">
            <div st-pagination="" st-items-by-page="tableState.pagination.number" st-displayed-pages="7" st-template="common/template/pagination.html"></div>
        </td>
    </tr>
    </tfoot>
</table>

template中的pagination.html代码:

<form class="pagination-define">
    <select ng-model="$parent.tableState.pagination.number" ng-options="item as item for item in $parent.itemsOptions" ng-change="$parent.getData($parent.tableState.pagination.currentPage)">
        <option value="">--请选择--</option>
    </select>
    <uib-pagination total-items="$parent.tableState.pagination.totalItemCount" items-per-page="$parent.tableState.pagination.number" ng-model="$parent.tableState.pagination.currentPage" ng-change="$parent.getData($parent.tableState.pagination.currentPage)" max-size="$parent.tableState.pagination.totalItemCount/$parent.tableState.pagination.number" class="pagination-sm" boundary-link-numbers="true" boundary-links="true" rotate="false" previous-text="&lsaquo;" next-text="&rsaquo;" first-text="&laquo;" last-text="&raquo;"></uib-pagination>
    <input type="text" ng-model="$parent.tableState.pagination.inputCurPage" min=1 my-max-number ="{{$parent.tableState.pagination.totalItemCount/$parent.tableState.pagination.number}}" current-page="{{$parent.tableState.pagination.currentPage}}">
    <button class="btn btn-info" ng-click="$parent.getData($parent.tableState.pagination.inputCurPage)" ng-disabled="!$parent.tableState.pagination.inputCurPage||$parent.tableState.pagination.inputCurPage==‘‘">Go</button>
</form>

smartTable.controller.js代码:

angular.module("smartTableApp")
    .controller("smartTableTestCtrl", [‘$scope‘, ‘$filter‘, ‘SmartTableTestServ‘, function($scope, $filter, SmartTableTestServ) {
        //动态显示条数
        $scope.itemsOptions = [5,10,20];
        //smart-table配置变量
        $scope.displayed = [];
        $scope.callServer = function callServer(tableState) {
            $scope.tableState = tableState; //tableState对象中包含sort排序信息以及search搜索信息
            $scope.getData(1);
        };
        $scope.getData = function(pageNo) {
            console.log("getData exe");
            var pagination = $scope.tableState.pagination;
            var start = pagination.start || 0;     //从第几条数据开始查询,默认0条
            var number = pagination.number || 10;   //每页显示条数
            pagination.currentPage = pagination.inputCurPage = pageNo;
            $scope.isLoading = true;    //控制数据加载状态
            //数据获取函数
            SmartTableTestServ.getPage(start, number, $scope.tableState).then(function(result) {
                console.log(result);
                $scope.displayed = result.data;
                pagination.totalItemCount = result.totalItems;  //设置数据总条数
                pagination.maxSize = pagination.totalItemCount/pagination.number; //一共有多少页
                $scope.isLoading = false;
                console.log("tableState信息:",$scope.tableState);
            });
        }
    }]);

对分页输入框中directive控制my-max-number.js代码

myApp
    //控制页码跳转框
    .directive(‘myMaxNumber‘, [‘$timeout‘, function ($timeout) {
        return {
            restrict: ‘EA‘,
            require: ‘ngModel‘,
            scope: {
                maxNumber: ‘@myMaxNumber‘,
                currentPage: ‘@currentPage‘
            },
            link: function (scope, element, attr, ctrl) {
                ctrl.$parsers.push(function (viewValue) {
                    var maxNumber = parseInt(scope.maxNumber, 10);
                    var curNumber = scope.currentPage; //当前页数
                    var transformedInput = viewValue.replace(/[^0-9]/g, ‘‘);
                    if (transformedInput !== viewValue||parseInt(transformedInput,10)<1||parseInt(transformedInput,10)>maxNumber) {
                        ctrl.$setViewValue(curNumber);
                        ctrl.$render();
                        return curNumber;
                    }
                    return viewValue;
                });
            }
        };
    }]);

官网提供的复选框directive

myApp
    .directive(‘csSelect‘, function () {
        return {
            require: ‘^stTable‘,
            template: ‘<input type="checkbox"/>‘,
            scope: {
                row: ‘=csSelect‘
            },
            link: function (scope, element, attr, ctrl) {

                element.bind(‘change‘, function (evt) {
                    scope.$apply(function () {
                        ctrl.select(scope.row, ‘multiple‘);
                    });
                });

                scope.$watch(‘row.isSelected‘, function (newValue, oldValue) {
                    if (newValue === true) {
                        element.parent().addClass(‘st-selected‘);
                    } else {
                        element.parent().removeClass(‘st-selected‘);
                    }
                });
            }
        };
    });

沿用了官网提供的service

angular.module("smartTableApp")
    .service (‘SmartTableTestServ‘, [‘$q‘, ‘$filter‘, ‘$timeout‘, function ($q, $filter, $timeout) {
        //this would be the service to call your server, a standard bridge between your model an $http

        // the database (normally on your server)
        var randomsItems = [];

        function createRandomItem(id) {
            var heroes = [‘Batman‘, ‘Superman‘, ‘Robin‘, ‘Thor‘, ‘Hulk‘, ‘Niki Larson‘, ‘Stark‘, ‘Bob Leponge‘];
            return {
                id: id,
                name: heroes[Math.floor(Math.random() * 7)],
                age: Math.floor(Math.random() * 1000),
                saved: Math.floor(Math.random() * 10000)
            };

        }

        for (var i = 0; i < 100; i++) {
            randomsItems.push(createRandomItem(i));
        }

        //fake call to the server, normally this service would serialize table state to send it to the server (with query parameters for example) and parse the response
        //in our case, it actually performs the logic which would happened in the server
        function getPage(start, number, params) {

            var deferred = $q.defer();

            var filtered = params.search.predicateObject ? $filter(‘filter‘)(randomsItems, params.search.predicateObject) : randomsItems;

            if (params.sort.predicate) {
                filtered = $filter(‘orderBy‘)(filtered, params.sort.predicate, params.sort.reverse);
            }

            var result = filtered.slice(start, start + number);

            $timeout(function () {
                //note, the server passes the information about the data set size
                deferred.resolve({
                    data: result,
                    totalItems: filtered.length,
                    numberOfPages: Math.ceil(filtered.length / number)
                });
            }, 1500);

            return deferred.promise;
        }

    return {
            getPage: getPage
        }
    }]);

先记录以上所需代码,写的不清不楚,等心情好点再细细补充说明~见谅,另外还需要改善优化

  

时间: 2024-10-10 09:40:33

angular smart-table组件如何定制化之初步研究的相关文章

依赖于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&

Angular企业级开发(10)-Smart Table插件开发

1.Smart Table内置的分页功能 Smart Table是基于AngularJS模块特性开发出来的一款优秀的表格组件,默认就支持过滤.排序等核心功能.开发者基于它也可以开发插件,满足个性化需求.比如分页.排序数据.通过Ajax获取等. Smart Table通过Custom Pagination插件可以完成分页功能: Custom pagination 运行效果如下: html代码结构: <table st-table="displayed" class="ta

大数据平台一键安装OS【定制化OS镜像制作】

 定制化 大数据平台一键安装OS 大数据平台一键安装OS系列 大数据平台一键安装OS[搭建脚本篇] 定制化OS镜像制作 1.操作环境 操作环境:VMware Workstarion 9 and vSphere client 系统:CentOS -6.8-x86_64 工具:gconf-editor anaconda repodata createrepo mkisofs rsync 2.主要思路 定制化是通过kickstart脚本来实现的,linux系统安装完毕后在root目录下会生成anaco

jquery-ui-datepicker定制化,汉化,因手机布局美观化源码修改

感谢浏览,欢迎交流=.= 公司微信网页需要使用日历控件,想到jquery-mobile,但是css影响页面布局,放弃后使用jquery-ui-datepicker. 话不多说,进入正题: 1.jqueryui官网定制化下载jquery-ui. 只取其core+datepicker 则仅需40kb,欣喜一番,因为之前想用dialog功能,发现定制下来150多kb,太奢侈了. 2.汉化代码 (function () { $.datepicker.regional['zh-CN'] = { clear

AI应用开发实战 - 定制化视觉服务的使用

AI应用开发实战 - 定制化视觉服务的使用 零.定制化视觉服务简介 有的时候,在构建应用的过程中,在缺少强大计算资源与高性能算法的情况下,我们不一定需要自己从零开始训练模型.我们需要用的一些轮子,已经有人给我们造好了. 就比如: 微软提供的定制化视觉服务. 在机器学习应用中,任何情况下都需要一个或大或小的模型.而怎么得到这个模型是其中最复杂的部分.定制化视觉服务相当于在云端提供了一个生成模型的方法,把模型相关的复杂的算法都简化了.同时,它不仅能够让用户自己管理训练数据,定义自己的分类问题,而且支

OA系统信用盘新增三个极速彩版本定制化视觉服务的使用

AI应用开发实战 - 定制化视觉服务的使用 OA系统信用盘新增三个极速彩版    下载地址  QQ2952777280 OA系统信用盘新增三个极速彩版本程序源码参数说明: 运行环境:php5.2+mysql 源码类别:时时彩(彩票)现金网系统/两面盘 界面语言:繁体中文 源码授权:无加密文件及认证授权,永久性可直接使用. 版本支持:PC/WAP网页版 编程语言:PHP 零.定制化视觉服务简介 有的时候,在构建应用的过程中,在缺少强大计算资源与高性能算法的情况下,我们不一定需要自己从零开始训练模型

Sass产品 - 定制化与本地化

1. 微前端是什么 微前端主要借鉴后端微服务的概念.简单地说,就是将一个巨无霸(Monolith)的前端工程拆分成一个一个的小工程.它们完全具备独立的开发.运行能力.整个系统就将由这些小工程协同合作,实现所有页面的展示与交互. 可以跟微服务这么对比着去理解: 微服务 微前端 一个微服务就是由一组接口构成,接口地址一般是 URL.当微服务收到一个接口的请求时,会进行路由找到相应的逻辑,输出响应内容. 一个微前端则是由一组页面构成,页面地址也是 URL.当微前端收到一个页面 URL 的请求时,会进行

使用beanstalkd实现定制化持续集成过程中pipeline - 持续集成系列

持续集成是一种项目管理和流程模型,依赖于团队中各个角色的配合.各个角色的意识和配合不是一朝一夕能练就的,我们的工作只是提供一种方案和能力,这就是持续集成能力的服务化.而在做持续集成能力服务化的过程中,最核心的一点就是,如何实现一个可定制化的任务流,即所谓的pipeline. 在传统的持续集成工具实现了pipeline功能,以供串联上下游job,并把多个job联系成一次完整的构建,例如jenkins的pipeline插件. 但是各种持续集成工具,或多或少都有自己的短板,总结起来如下: 1.配置并不

定制化Azure站点Java运行环境(1)

Azure website提供了为现代化的web应用程序快速部署的PAAS平台,可以让用户几分钟之内快速的将自己的应用部署到云端,并且提供了自动扩展(auto-scaling),SSL,多种语言(Java,Python,PHP, Node.JS, .Net) 等的支持,并且可以和其他Azure服务无缝整合等特性,赢得了很多用户的青睐. 作为PAAS平台,Azure website的app运行环境,OS等底层设施都由微软进行管理,用户只需要关心自己的App和Data即可,但在一些情况下,用户希望能