(首先声明本文来自博客园本人原创,转载请说明出处。欢迎关注: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简易分页设计(二):封装成指令的更多相关文章

  1. Angular简易分页设计(一):基本功能实现

    (首先声明本文来自博客园本人原创,转载请说明出处.欢迎关注:http://www.cnblogs.com/mazhaokeng/p/6752990.html) 之前网站的后台管理为了图快,把Jquer ...

  2. Directx11学习笔记【二】 将HelloWin封装成类

    我们把上一个教程的代码封装到一个类中来方便以后的使用. 首先新建一个空工程叫做MyHelloWin,添加一个main.cpp文件,然后新建一个类叫做MyWindow,将于窗体有关的操作封装到里面 My ...

  3. XML解析之sax解析案例(二)使用sax解析把 xml文档封装成对象

    Demo1类: import java.io.File; import java.util.List; import javax.xml.parsers.SAXParser; import javax ...

  4. 再谈MV*(MVVM MVP MVC)模式的设计原理—封装与解耦

    精炼并增补于:界面之下:还原真实的MV*模式 图形界面的应用程序提供给用户可视化的操作界面,这个界面提供给数据和信息.用户输入行为(键盘,鼠标等)会执行一些应用逻辑,应用逻辑(application ...

  5. JSP的学习(3)——语法知识二之page指令

    本篇接上一篇<JSP的学习(2)——语法知识一>,继续来学习JSP的语法.本文主要从JSP指令中的page指令,对其各个属性进行详细的学习: JSP指令: JSP指令是为JSP引擎而设计的 ...

  6. OAuth2简易实战(二)-模拟客户端调用

    1. OAuth2简易实战(二) 1.1. 目标 模拟客户端获取第三方授权,并调用第三方接口 1.2. 代码 1.2.1. 核心流程 逻辑就是从数据库读取用户信息,封装成UserDetails对象,该 ...

  7. angular上传获取图片的directive指令

    在AngularJS中,操作DOM一般在指令中完成,那么指令是如何实现的呢?指令的作用是把我们自定义的语义化标签替换成浏览器能够认识的HTML标签 一般的事件监听是在对静态的dom绑定事件,而如果在指 ...

  8. Django分页类的封装

    Django分页类的封装 Django ORM  封装 之前有提到(Django分页的实现)会多次用到分页,将分页功能封装起来能极大提高效率. 其实不是很难,就是将之前实现的代码全都放到类中,将需要用 ...

  9. android中RecycleView分页原生代码封装,无任何第三方代

    概述 RecycleView分页加载封装,简单方便,功能齐全 详细 代码下载:http://www.demodashi.com/demo/13283.html 一.场景: 在项目开发中经常使用到列表集 ...

随机推荐

  1. React中父组件与子组件之间的数据传递和标准化的思考

    React中父组件与子组件之间的数据传递的的实现大家都可以轻易做到,但对比很多人的实现方法,总是会有或多或少的差异.在一个团队中,这种实现的差异体现了每个人各自的理解的不同,但是反过来思考,一个团队用 ...

  2. 在TFS中通过程序动态创建Bug并感知Bug解决状态

    为便于跟踪问题解决情况,预警引擎产生的比较严重的预警日志,需要在TFS中登记Bug,通过TFS的状态流转,利用TFS Bug的Web挂钩功能,动态感知Bug解决状态,从而跟踪预警问题的解决状态, 整体 ...

  3. 日期控件My97DatePicker的使用

    一. 简介 1. 简介 目前的版本是:4.8 2. 注意事项 My97DatePicker目录是一个整体,不可破坏里面的目录结构,也不可对里面的文件改名,可以改目录名 My97DatePicker.h ...

  4. Akamai在内容分发网络中的算法研究(翻译总结)

    作者 | 钱坤 钱坤,腾讯后台开发工程师,从事领域为流媒体CDN相关,参与腾讯TVideo平台开发维护. 原文是<Algorithmic Nuggets in Content Delivery& ...

  5. SUSE linux 使用LVM安装系统和管理

    引出 在我们安装好linux系统后会发现在需要修改磁盘分区的时候会比较困难,系统安装的/目录的文件系统要更改基本不太可能,其他目录如/home目录也比较困难.但是系统安装时要是采用的LVM管理的方式安 ...

  6. PRINCE2的发展情况是什么样

    英国皇家特许培训机构AXELOS近期公布了一份调查结果,调查共有172位项目经理参与,其结果展示了未来全球趋势,对项目经理未来的职业形态和对他们必备技能的影响.  未来的项目管理职业  调查结果同时给 ...

  7. NPOI扩展--判断指定单元格是否为合并单元格和输出该单元格的行列跨度(维度)

    因工作需要用到跨合并单元格获取数据,所以写了个NPOI扩展类. 主要方法如下: 1.判断指定行/列索引(单元格)是否为合并单元格. 2.获取指定列索引的实际含有数据的单元格. 3.返回指定行/列索引的 ...

  8. IOS开发创建开发证书及发布App应用(七)——在iTunes创建填写应用基本信息

    7.在iTunes创建填写应用基本信息 依旧打开苹果的开发者网站 https://developer.apple.com/ 点击Member,如下图 (注意,下面的图示是登录之后的) 点击iTunes ...

  9. 使用EPPlus读写xlsx文件

    朋友有个需求,想对N张excel表做过滤和合并的处理,拜托我写个小程序.因为用户的背景是非专业用户,因此最好的选择是写个GUI程序,再加上读写excel的需求,所以我的首选就是C#的WinForm了. ...

  10. Java并发编程:同步锁、读写锁

    之前我们说过线程安全问题可以用锁机制来解决,即线程必要要先获得锁,之后才能进行其他操作.其实在 Java 的 API 中有这样一些锁类可以提供给我们使用,与其他对象作为锁相比,它们具有更强大的功能. ...