Angular简易分页设计(二):封装成指令
(首先声明本文来自博客园本人原创,转载请说明出处。欢迎关注:http://www.cnblogs.com/mazhaokeng/)
之前我们讲过,Angular分页代码确实不难实现,但是由于在多个路由页码上使用到了分页,要一版一版地进行复制粘贴确实麻烦。倘若代码需要修改,那就满世界乱跑一处处修改。
幸好我们有Angular directive(自定义指令)!Angularjs中内置了很多指令,常用的如ng-repeat、ng-class等等,我们也可以自己定义指令,而且在项目中是非常普遍的。具体是啥这里不多说明,推荐一篇文章 https://github.com/zhengweikeng/blog/issues/6 ,上面说的非常清楚。
下面我们详细说说directive的封装。首先我们需要把html做成语义化标签,并把我们需要的变量暴露出来:
<pagination page="page" max-page="maxPage" ng-click="pageTo()"></pagination>
我们需要当前页和最大页数。pageTo()是父控制器绑定的函数,用于执行其余代码,不属于分页指令内部函数。然后我们就对directive的各个属性进行设置
app.directive('pagination', function() {
return {
//html
template:
'<div class="pagination">' +
'<ul class="pager">' +
'<li><a href="javascript:void(0)" ng-click="pageGo(1)">首页</a></li>' +
'<li><a href="javascript:void(0)" ng-click="pagePre()">上一页</a></li>' +
'</ul>' +
'<ul>' +
'<li ng-repeat="num in pageShowList" ng-class="{active: clickPage == num}">' +
'<a href="javascript:void(0)" ng-click="pageGo(num)">{{num}}</a>' +
'</li>' +
'</ul>' +
'<ul class="pager">' +
'<li><a href="javascript:void(0)" ng-click="pageNext()">下一页</a></li>' +
'<li><a href="javascript:void(0)" ng-click="pageGo(maxPage)">尾页:{{maxPage}}</a></li>' +
'</ul>' +
'</div>',
//替换
replace: true,
首先,html标签名字pagination必须要和js代码一致,而返回的属性template是我们的html代码,需要用字符串的方式拼接起来,replace属性为true,表示代码运行时需要把标签替换成template内的html代码。这样需要用到分页的页码只要引入pagination标签就可以了。
然后是我们的js代码。由于各个功能函数基本是与父控制器隔离的(模块化),我们需要把代码写在link函数内而不是controller内。controller函数一般用于指令之间可复用代码的编写。详细分页功能实现的代码在前一篇文章中有说明,这里不多说。我们就说说为什么需要对最大页数maxPage进行监听。
/* 监听最大页数,如果页数变化,重新生成页数数组
* */
var watch = $scope.$watch('maxPage', function (newValue, oldValue, scope) {
pageList = [];
for (var i = 1; i <= newValue; i++) { //一个个压入页码
pageList.push(i);
}
resetPageOrder($scope.page);
});
一开始设计时,我希望能够调用一个函数来对页码数量和页码数组进行初始化,因为在进行数据表搜索时,后台返回不同的表格,那么总页数也要跟着变化,所以初始化总页数和其数组是需要多次执行的。但是directive并没有能够把一个函数直接向父控制器暴露的方式,要强行暴露的话只能把函数封装服务。这样父控制器代码就会混乱了,一方面我需要指令的变量,另一方面又要注入此指令定义的服务,耦合度令人发指。
我也试过把函数当成变量向外暴露,但是这个方式在本地测试时没问题,在测试服务器上就各种错误。明显这种非官方的小聪明是不能被Angular.js接受的。
指令内部的变量对外暴露是最简单的,那么只要能让变量触发函数就没问题了。还好我们有Angular提供的$watch服务,只要设置总页数maxPage一旦变化,那么页码数组也重新生成不就得了吗!这样整个指令只需要把当前页page和最大页数maxPage对外暴露就行了,代码的耦合度回到了我们的预期。
最后我们设置这两个变量的作用域,增加属性scope。
//作用域
scope:{
page: '=', //等号是双向绑定
maxPage: '@'
},
scope默认是false,表示一切变量对外暴露。html代码中的属性max-page中的值就与指令中的maxPage绑定了,注意html属性不支持驼峰法命名,所以用“-”分割单词。这里说明下:
(1)使用@符号进行单向绑定,类似于将父作用域中的变量拷贝一份到指令的独立作用域中。
(2)使用=符号表示变量是双向绑定的,page是向父作用域暴露的所以不使用@。
具体项目我放在了Github上: https://github.com/makeng/Angular-pagination-/tree/master,欢迎大家指教。
Angular简易分页设计(二):封装成指令的更多相关文章
- Angular简易分页设计(一):基本功能实现
(首先声明本文来自博客园本人原创,转载请说明出处.欢迎关注:http://www.cnblogs.com/mazhaokeng/p/6752990.html) 之前网站的后台管理为了图快,把Jquer ...
- Directx11学习笔记【二】 将HelloWin封装成类
我们把上一个教程的代码封装到一个类中来方便以后的使用. 首先新建一个空工程叫做MyHelloWin,添加一个main.cpp文件,然后新建一个类叫做MyWindow,将于窗体有关的操作封装到里面 My ...
- XML解析之sax解析案例(二)使用sax解析把 xml文档封装成对象
Demo1类: import java.io.File; import java.util.List; import javax.xml.parsers.SAXParser; import javax ...
- 再谈MV*(MVVM MVP MVC)模式的设计原理—封装与解耦
精炼并增补于:界面之下:还原真实的MV*模式 图形界面的应用程序提供给用户可视化的操作界面,这个界面提供给数据和信息.用户输入行为(键盘,鼠标等)会执行一些应用逻辑,应用逻辑(application ...
- JSP的学习(3)——语法知识二之page指令
本篇接上一篇<JSP的学习(2)——语法知识一>,继续来学习JSP的语法.本文主要从JSP指令中的page指令,对其各个属性进行详细的学习: JSP指令: JSP指令是为JSP引擎而设计的 ...
- OAuth2简易实战(二)-模拟客户端调用
1. OAuth2简易实战(二) 1.1. 目标 模拟客户端获取第三方授权,并调用第三方接口 1.2. 代码 1.2.1. 核心流程 逻辑就是从数据库读取用户信息,封装成UserDetails对象,该 ...
- angular上传获取图片的directive指令
在AngularJS中,操作DOM一般在指令中完成,那么指令是如何实现的呢?指令的作用是把我们自定义的语义化标签替换成浏览器能够认识的HTML标签 一般的事件监听是在对静态的dom绑定事件,而如果在指 ...
- Django分页类的封装
Django分页类的封装 Django ORM 封装 之前有提到(Django分页的实现)会多次用到分页,将分页功能封装起来能极大提高效率. 其实不是很难,就是将之前实现的代码全都放到类中,将需要用 ...
- android中RecycleView分页原生代码封装,无任何第三方代
概述 RecycleView分页加载封装,简单方便,功能齐全 详细 代码下载:http://www.demodashi.com/demo/13283.html 一.场景: 在项目开发中经常使用到列表集 ...
随机推荐
- android-自定义广告轮播Banner(无限循环实现)
关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...
- 优雅的使用sublime写lua~ sublime lua相关必装插件推荐~~
缘起 lua脚本语言虽好,代码写得飞快,可是写错了调试起来却很困难,lua使用者经常容易犯得一个错误是--写错变量名了,if end 嵌套太多没匹配~,多打了一个逗号, 假设定义了一个变量 local ...
- HTML页面内容禁止选择、复制、右键
<body leftmargin=0 topmargin=0 oncontextmenu='return false' ondragstart='return false' onselectst ...
- Spring之IOC详解
学过Spring的小伙伴对于IOC一定不陌生,IOC:控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spr ...
- 卸载php+apache+mysql
一.卸载删除 mysql 1 sudo apt-get autoremove --purge mysql-server-5.0 2 sudo apt-get remove mysql-server ...
- IE浏览器img不显示解决
下面的只是一个我们在网页中插入一个图片的简单例子,浏览的时候我们也没有任何问题 <!doctype html> <html> <head> <meta cha ...
- curl javaSSm框架中传入json数组的格式方法
curl与java结合传入get.post,head请求, 比如: curl的地址: curl -l 127.0.0.1:8080/spacobj/core/do?acid=100 -H " ...
- mui学习链接
http://dev.dcloud.net.cn/mui/snippet/ http://www.bcty365.com/content-146-2453-1.html hbuilder转rem值: ...
- jqzoom插件
<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title> ...
- win32/mfc/qt 异常处理与总结
际异常一: libcpmtd.lib(xmbtowc.obj) : error LNK2001: unresolved external symbol __CrtDbgReport Debug/B机. ...