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
}
}]);

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

  

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

  1. 依赖于angular的table组件

    组件实现了以下功能 1. 列宽可动态拖动 2. 列数据排序 3. 列过滤 4. 列位置自由调整 除了需要引入angular.js(我用的是1.4.6版本),还需要引用一个angular衍生出来的插件n ...

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

    1.Smart Table内置的分页功能 Smart Table是基于AngularJS模块特性开发出来的一款优秀的表格组件,默认就支持过滤.排序等核心功能.开发者基于它也可以开发插件,满足个性化需求 ...

  3. Yoshino: 一个基于React的可定制化的PC组件库

    Github: https://github.com/Yoshino-UI... Docs: https://yoshino-ui.github.io/#/ Cli-Tool: https://git ...

  4. ant-design的Table组件自定义空状态

    Table,是antd中一个我们经常使用的组件,在官方文档中给出了非常详细的实例以及API, 但在我们在使用过程中可能需要根据项目的要求来定制空状态时的展示. 什么是空状态呢? 在antd的官方文档中 ...

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

    感谢浏览,欢迎交流=.= 公司微信网页需要使用日历控件,想到jquery-mobile,但是css影响页面布局,放弃后使用jquery-ui-datepicker. 话不多说,进入正题: 1.jque ...

  6. python+robot framework实现测报告定制化和邮件发送

    前面已经介绍了python+robot framework自动化框架和基本原理的实现,详情请看 python+robot framework接口自动化测试 本章主要讲解报告已经产生那如何以自动化的方式 ...

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

    AI应用开发实战 - 定制化视觉服务的使用 本篇教程的目标是学会使用定制化视觉服务,并能在UWP应用中集成定制化视觉服务模型. 前一篇:AI应用开发实战 - 手写识别应用入门 建议和反馈,请发送到 h ...

  8. AntD02 Table组件的使用

    1 前提准备 1.1 创建一个angular项目 1.2 将 Ant Design 整合到 Angular 项目中 1.3 官方文档 点击前往 2 简单使用 <nz-table #rowSele ...

  9. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:11.定制化Log输出

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 在<迷你微信>服务器中,我们用了Log4J来进行输出,这可以在我们程序出现异常的时候找到错误发生时 ...

随机推荐

  1. PhotoShop CS6安装教程

    PhotoShop CS6安装教程... ===================== 安装包和激活码在最下面: ======================== =================== ...

  2. 【整合】input标签JS改变Value事件处理方法

    某人需要在时间控件给文本框赋值时,触发事件函数.实现的效果: 1.文本框支持手工输入,通过用户输入修改值,手工输入结束后触发事件.阻塞在于失去焦点后才触发(输入过程中不触发事件) 2.通过JS方法修改 ...

  3. SourceTree 简单使用 for Mac

    系统版本: 10.12.6 SourceTree版本:2.3.1 (中文版)SourceThree安装包 密码:9jc3 传送门 目录 1.创建gitHub账号和仓库 2.sourceTree管理gi ...

  4. 【Unity游戏开发】浅谈Unity游戏开发中的单元测试

    一.单元测试的定义与作用 单元测试定义:单元测试在传统软件开发中是非常重要的工具,它是指对软件中的最小可测试单元进行检查和验证,一般情况下就是对代码中的一个函数去进行验证,检查它的正确性.一个单元测试 ...

  5. 【渗透笔记】拿下某小H网的全过程

    自从班上A片小王子的7个T资源被封了以后,本小白为造福全班同学,尝试拿下个小H网,先用webrobot搜某些只有小H网才会出现的关键词 本以为直接导出放御剑里跑就行了,然并软.于是用awvs扫了一下, ...

  6. thinkjs学习-this.assign传递数据和ajax调用后台接口

    在页面加载时,就需要显示在页面上的数据,可以在后台使用this.assign赋值,在前台通过ejs等模板获取:用户点击按钮,或者触发某些事件和后台进行交互时,就需要用到ajax调用后台接口.本文通过一 ...

  7. Java开发相关命名规范

    JAVA文件命名规范 1.类命名 抽象类以 Abstract 或者 Base 开头.异常类以 Exception 作为后缀.枚举类以 Enum 作为后缀.工具类以 Utils 作为后缀(相应的包名最后 ...

  8. mysql互换表中两列数据

    在开发过程中,有时由于业务等需要把一个表中的两列数据进行交换. 解决方案 使用update命令,这完全得益于MySQL SQL命令功能的强大支持. 表格中原来数据类似如下: select * from ...

  9. WebStorm ES6 语法支持设置&babel使用及自动编译

    一.语法支持设置 Preferences > Languages & Frameworks > JavaScript 二.Babel安装 1.全局安装 npm install -g ...

  10. ThinkPhp5源码剖析之Cache

    为什么需要Cache(缓存)? 假设现在有一个小说网,有非常多的读者,有一篇新的章节更新了,那么可能一分钟内有几万几十万的访问量. 如果没有缓存,同样的内容就要去数据库重复查询,那可能网站一下就挂掉了 ...