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 一.场景: 在项目开发中经常使用到列表集 ...
 
随机推荐
- 初用Linux, 安装Ubuntu16.04+NVIDIA387+CUDA8.0+cudnn5.1+TensorFlow1.0.1
			
因为最近Deep Learning十分热门, 装一下TensorFlow学习一下. 本文主要介绍安装流程, 将自己遇到的问题说明出来, 并记录自己如何处理, 原理方面并没有能力解释. 由于本人之前从来 ...
 - Android Handler消息机制不完全解析
			
1.Handler的作用 Android开发中,我们经常使用Handler进行页面的更新.例如我们需要在一个下载任务完成后,去更新我们的UI效果,因为AndroidUI操作不是线程安全的,也就意味着我 ...
 - jQuery kxbdMarquee 无缝滚动
			
转:http://code.ciaoca.com/jquery/kxbdmarquee/ <marquee> 曾是 IE 下独有的一个走马灯效果的标签,其他浏览器并不兼容,于是出现了使用 ...
 - 使用sudo提示用户不在sudoers文件中的解决方法
			
切换到root用户 [linux@localhost ~]$ su root 密码: [root@localhost ~]# 2 查看/etc/sudoers文件权限,如果只读权限,修改为可写权限 [ ...
 - MyBatis极速入门开发手册(2017-2-6更新)
			
前言: 本篇文章对我的学习内容做一个归纳梳理,同时也记录一些学习过程中遇上的问题及注意事项等等,可以帮助新入门的朋友们消除一些误区与盲区,希望能帮上一些正在学习的朋友们.在编写时会引用一些mybati ...
 - Servlet+jsp的分页案例
			
查询的分页,在web中经常用到.一般,分页要维护的信息很多,我们把这些相关的信息,分装到一个类中,PageBean.具体如下: package cn.itcast.utils; import java ...
 - 【Flex】编辑器的缩放功能(绝对定位和相对定位)
			
一.横向的ide拖动缩放效果 <?xml version="1.0" encoding="utf-8"?> <s:WindowedApplic ...
 - 老李分享:Robotium创建Note的实例
			
老李分享:Robotium创建Note的实例 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq ...
 - 老李推荐:第14章6节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-启动ViewServer
			
老李推荐:第14章6节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-启动ViewServer poptest是国内唯一一家培养 ...
 - 老李推荐:第8章3节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动AndroidDebugBridge 3
			
首先它通过查找JVM中的System Property来找到"com.android.monkeyrunner.bindir"这个属性的值,记得前面小节运行环境初始化的时候在mon ...