发表于: 2018-10-21 20:01:27

1 344


今天完成的事情:分页封装成指令
明天计划的事情:修改任务六的bug
遇到的问题:自定义还是不怎么清楚;要再看看
收获:

Angular简易分页设计:封装成指令

  

  下面我们详细说说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是向父作用域暴露的所以不使用@。


然后根据上述写出来的效果;


<body ng-app="myApp" ng-controller="indexCtrl">
<!--------------------------------------- html ----------------------------------------------------->
<!--分页directive-->
<pagination page="page" max-page="maxPage" ng-click="pageTo()"></pagination>
<!--显示文本框-->
<p>当前页数:{{showPage}}</p>
<p>总页数:
   <input type="text" ng-model="showMaxPage" ng-change="resetMaxPage()" title="显示的页码"/>
</p>

<!--------------------------------------- js ----------------------------------------------------->
<script src="js6/angular-1.6.6.js" type="text/javascript"></script>
<script>
   /*引入的模块*/
   var app = angular.module('myApp', []);
   app.controller('indexCtrl',function($scope){
/*--- 变量 ---*/
       $scope.showPage = 1;    //显示页数当前为1
       $scope.maxPage = 12;    //初始化总页数为12
       $scope.showMaxPage = 12;
       /*--- 绑定函数 ---*/
       /*  显示当前页码
       * */
       $scope.pageTo = function () {
$scope.showPage = $scope.page;
       };
       /*  改变最大页数
       * */
       $scope.resetMaxPage = function () {
$scope.page = 1;    //初始页复位
           $scope.maxPage = $scope.showMaxPage;
       };
   });
</script>



app.directive('pagination', function() {
return {
//元素
       restrict: 'E',
       //作用域
       scope:{
page: '=',  //等号是双向绑定
           maxPage: '='
       },
       //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,
       //link函数
       link: function ($scope) {
//变量
           var pageList = [];
           $scope.page = 1;    //初始默认为第一页
           $scope.pageShowList = [];    //最大显示7个格子

           /*  监听最大页数,如果页数变化,重新生成页数数组
           * */
           var watch = $scope.$watch('maxPage', function (newValue, oldValue, scope) {
pageList = [];
               for (var i = 1; i <= newValue; i++) { //一个个压入页码
                   pageList.push(i);
               }
resetPageOrder($scope.page);
           });

           /*  直接跳页
            * */
           $scope.pageGo = function (num) {
$scope.page = num;
               resetPageOrder($scope.page);
           };

           /*  上一页
            * */
           $scope.pagePre = function () {
if( $scope.page > 1){
$scope.page --;
                   resetPageOrder($scope.page);
               }
};

           /*  下一页
            * */
           $scope.pageNext = function () {
if ( $scope.page < $scope.maxPage ){
$scope.page ++;
                   resetPageOrder($scope.page);
               }
};

           /*  重新设置页码
           *   @param num当前页码
            * */
           function resetPageOrder(num) {
$scope.clickPage = num; //变色
               //点击小于4的页数
               if (num < 4 ) {
$scope.pageShowList = pageList.slice(0, 7);  //只显示最大7
               }
//点击大于4
               else{
//在总页数尾部
                   if ( num > $scope.maxPage -4 ){ //去除多出的页数
                       $scope.pageShowList = pageList.slice($scope.maxPage-7, $scope.maxPage);
                   }
//之前两种情况的中间
                   else{
$scope.pageShowList = [
num - 3,
                           num - 2,
                           num - 1,
                           num,
                           num + 1,
                           num + 2,
                           num + 3
                       ];
                   }
}
}
}
}
});












任务总结:

任务名称:js=TASK5

成果链接:https://tinklegcy.github.io/JS1/js5/index.html

任务耗时:2018.9.8-2018.10.21,延期一个月

技能脑图:

个人脑图:


官方脑图:

任务总结:

    1. 任务进度是不符合预期,延期,原因是在于前面学的不合格,又重新理了一遍所学的知识,然后写完js5之后一直没有上交;在学习AngularJS之后看不懂;碰到难题一直拖着;在做任务的时候一定要写完任务之后上交不能拖着;认真了解自己所学的知识。

    2. 任务中遇到哪些疑难问题,最终是如何解决的,有哪些值得分享的收获
    3. 1.nginx:

      不知道如何配置nginx,看任务的接口文档看不懂,不知道该怎么配置,试着改了好几次,然后用postman测试接口

      才知道各个配置是什么意思。

      2.ajax:

      ajax主要难在怎么发送数据和进行响应,看任务步骤根本看不懂该怎么发送才是对的,网上的一些资料也写的很简单,

      不过看多几次把简单的定义弄懂,然后看接口文档,用postman发送字段测试,再在js上发送字段测试一下基本就没什

      么问题了。




返回列表 返回列表
评论

    分享到