web学习笔记10-自定义时间选择器指令编写

    好久没有更新了,最近在做一个前端angularJs项目,内容比较复杂,幸好都不算太难。前两天自己写了个简单的时间选择器,但是水平有限,写的代码量稍微有点大,就想着封装成一个指令,暴露出小时和分钟,以便在控制器中获取到,并且发送到后台。不过,之前虽然一直在写angular,指令也接触到不少,但是一直是在使用别人写好的,自己写还是第一次,就想着,正好利用下这个机会,自己尝试些一个简单点的指令也挺好的。

    这里我还是按照往常习惯一样,先贴github地址,毕竟看那么长的东西也是太累了。angular-timepicker

    效果图如图:

时间选择器效果.gif

    点击上下小三角可以变换时间,点击获取时间的按钮可以弹出提示框显示选择的时间,并且在控制台中打印出来。其实这些写起来并不是很难,在写指令的时候可能对大多数前端的小伙伴来说都不算难事,不过说实话,一年前左右刚接触angular的时候,其实已经在慕课网上看过大漠清秋讲的angular课程,当时初接触前端,看了他讲的指令,其实也没看懂。昨晚回去又看了一遍他讲的课,发现理解了一点了,正好昨天在写指令的时候遇到一些小问题,今天早上也是迎刃而解了。

    下面我就不废话了,直接写代码了,我把这个指令单独写成一个demo了。所以大家要是想使用的话,只需要下载之后复制粘贴就ok了。

第一步:编写html

    先编写出html来,把基本的页面编写出来:

html
<div class="co-timepicker-box" style="margin-left: 15px">
    <input type="text" class="fl wi-timepicker-timeinput" ng-model="hour" maxlength="2">
    <div class="fl wi-timepicker-change-box">
        <div class="wi-timepicker-change-time arrow-up" ng-click="timeUp(1)"></div>
        <div class="wi-timepicker-change-time arrow-down" ng-click="timeDown(1)"></div>
    </div>
    <div class="fl wi-timepicker-maohao">
        :
    </div>
    <input type="text" class="fl wi-timepicker-timeinput" ng-model="minute" maxlength="2">
    <div class="fl wi-timepicker-change-box">
        <div class="wi-timepicker-change-time arrow-up" ng-click="timeUp(2)"></div>
        <div class="wi-timepicker-change-time arrow-down" ng-click="timeDown(2)"></div>
    </div>
</div>

第二步:编写css

css
/* timepicker start */
.co-timepicker-box {
    float: left;
    width: 110px;
    height: 32px;
    border: 1px solid #cccccc;
}

.fl{
    float: left;
}
.wi-timepicker-timeinput{
    width: 35px;
    height: 30px;
    padding: 0;
    font-size: 20px;
    text-align: center;
    line-height: 30px;
    border:0;
    outline: none;
}

.wi-timepicker-change-box{
    width: 15px;
    height: 30px;
    border:0;
}
.wi-timepicker-change-time{
    width: 15px;
    height: 15px;
    border: 0;
}
.wi-timepicker-maohao{
    width: 7px;
    height: 30px;
    font-size: 16px;
    text-align: center;
    line-height: 30px;
}
.arrow-up{
    background: url("../img/time-up.png")no-repeat center center;
    background-size: 14px 6px;
}
.arrow-down{
    background: url("../img/time-down.png")no-repeat center center;
    background-size: 14px 6px;
}
/* timepicker end */

第三步:编写js

    页面基本完成。之后就是js编写,js中主要需要注意的是,小时和分钟在个位数的时候前面需要加上0,在小时0往下是23,分钟往下是59,这个需要单独的一个方法。然后就是给小时分钟赋初始值。然后就是点击方法。

js
//转换格式的方法
$scope.PrefixInteger = function (num, n) {
    return (Array(n).join(0) + num).slice(-n);
};
//时间选择器的处理
if(!$scope.hour){
    $scope.hour = 12;
}
if(!$scope.minute){
    $scope.minute = '00';
}
var reg=/^\d+$/;
$scope.timeUp = function (type) {
    if(type == 1){
        if(reg.test($scope.hour)){
            if(parseInt($scope.hour) >=0 && parseInt($scope.hour) <= 23){
                if($scope.hour == 23){
                    $scope.hour = -1;
                }
                $scope.hour = parseInt($scope.hour) + 1;
            }else {
                $scope.hour = 12;
            }
        }else {
            $scope.hour = 12;
        }
        $scope.hour = $scope.PrefixInteger($scope.hour,2);
    }else if(type == 2){
        if(angular.isNumber($scope.minute) || reg.test($scope.minute)){
            if(parseInt($scope.minute) >=0 && parseInt($scope.minute) <=59){
                if($scope.minute == 59){
                    $scope.minute = -1;
                }
                $scope.minute = parseInt($scope.minute) + 1;
             }else {
                $scope.minute = 0;
             }
         }else {
            $scope.minute = 0;
         }
         $scope.minute = $scope.PrefixInteger($scope.minute,2);
        }
    };
    $scope.timeDown = function (type) {
        if(type == 1){
            if(angular.isNumber($scope.hour) || reg.test($scope.hour)){
                if(parseInt($scope.hour) >=0 && parseInt($scope.hour) <=24){
                    if($scope.hour == 0){
                        $scope.hour = 24;
                    }
                    $scope.hour = parseInt($scope.hour) - 1;
            }else {
                 $scope.hour = 12;
            }
        }else {
            $scope.hour = 12;
        }
         $scope.hour = $scope.PrefixInteger($scope.hour,2)
        }else  if(type == 2){
            if(angular.isNumber($scope.minute) || reg.test($scope.minute)){
                if(parseInt($scope.minute) >=0 && parseInt($scope.minute) <=60){
                    if($scope.minute == 0){
                        $scope.minute = 60;
                    }
                    $scope.minute = parseInt($scope.minute) - 1;
                }else {
                    $scope.minute = 0;
                }
            }else {
                $scope.minute = 0;
            }
                $scope.minute = $scope.PrefixInteger($scope.minute,2);
           }
        };

    以上就是完成了基本的编写,下面就是要写指令了,需要把上面的东西都添加到指令中。

第四步:编写指令

directive
var app = angular.module('myApp', []);
app.directive("coTimepicker", function() {
return {
    restrict:'AE',
    scope:{
        hour:'=',
        minute:'='
    },
    template:'<div class="co-timepicker-box" style="margin-left: 15px">'+
    '<input type="text" class="fl wi-timepicker-timeinput" ng-model="hour" maxlength="2">' +
    '<div class="fl wi-timepicker-change-box">' +
    '<div class="wi-timepicker-change-time arrow-up" ng-click="timeUp(1)"></div>' +
    '<div class="wi-timepicker-change-time arrow-down" ng-click="timeDown(1)"></div>' +
    '</div>' +
    '<div class="fl wi-timepicker-maohao">' +
    ':' +
    '</div>' +
    '<input type="text" class="fl wi-timepicker-timeinput" ng-model="minute" maxlength="2">' +
    '<div class="fl wi-timepicker-change-box">' +
    '<div class="wi-timepicker-change-time arrow-up" ng-click="timeUp(2)"></div>' +
    '<div class="wi-timepicker-change-time arrow-down" ng-click="timeDown(2)"></div>' +
    '</div>'+
    '</div>',
    link: function ($scope,element,attrs) {
        $scope.PrefixInteger = function (num, n) {
            return (Array(n).join(0) + num).slice(-n);
        };
        //--------------------------------------
        if(!$scope.hour){
            $scope.hour = 12;
        }
        if(!$scope.minute){
            $scope.minute = '00';
        }
        var reg=/^\d+$/;
        $scope.timeUp = function (type) {
            if(type == 1){
                if(reg.test($scope.hour)){
                    if(parseInt($scope.hour) >=0 && parseInt($scope.hour) <= 23){
                        if($scope.hour == 23){
                            $scope.hour = -1;
                        }
                        $scope.hour = parseInt($scope.hour) + 1;
                    }else {
                        $scope.hour = 12;
                    }
                }else {
                    $scope.hour = 12;
                }
                $scope.hour = $scope.PrefixInteger($scope.hour,2);
            }else if(type == 2){
                if(angular.isNumber($scope.minute) || reg.test($scope.minute)){
                    if(parseInt($scope.minute) >=0 && parseInt($scope.minute) <=59){
                        if($scope.minute == 59){
                            $scope.minute = -1;
                        }
                        $scope.minute = parseInt($scope.minute) + 1;
                    }else {
                        $scope.minute = 0;
                    }
                }else {
                    $scope.minute = 0;
                }
                $scope.minute = $scope.PrefixInteger($scope.minute,2);
            }
        };
        $scope.timeDown = function (type) {
            if(type == 1){
                if(angular.isNumber($scope.hour) || reg.test($scope.hour)){
                    if(parseInt($scope.hour) >=0 && parseInt($scope.hour) <=24){
                        if($scope.hour == 0){
                            $scope.hour = 24;
                        }
                        $scope.hour = parseInt($scope.hour) - 1;
                    }else {
                        $scope.hour = 12;
                    }
                }else {
                    $scope.hour = 12;
                }
                $scope.hour = $scope.PrefixInteger($scope.hour,2)
            }else  if(type == 2){
                if(angular.isNumber($scope.minute) || reg.test($scope.minute)){
                    if(parseInt($scope.minute) >=0 && parseInt($scope.minute) <=60){
                        if($scope.minute == 0){
                            $scope.minute = 60;
                        }
                        $scope.minute = parseInt($scope.minute) - 1;
                    }else {
                        $scope.minute = 0;
                    }
                }else {
                    $scope.minute = 0;
                }
                $scope.minute = $scope.PrefixInteger($scope.minute,2);
            }
        };
    }
}});

第五步:使用指令

    指令写完之后,需要使用的,所以在html上写上指令

<co-timepicker hour="hour" minute="minute"></co-timepicker>

在控制器中可以获取到小时和分钟。同时也是可以在html上写死。在控制器中可以只用使用$scope.hour$scope.minute来获取小时和分钟。

    其实这样就算是已经编写完成,可以直接使用了,昨天我没有搞清楚指令内作用域scope里面的一些用法,导致没法提取出小时和分钟,晚上研究了之后发现其实不算难,这里我也就不讲一些指令的基础了,毕竟我自己也没有搞太明白。很多时候,基础稍微看下之后,应该直接跟着实例去实践,实践之后才能知道一些光看基础不知道的东西。

    感觉自己写东西还是有点乱,没有说的很清楚。不过大家在github上下载下来一看就能明白了,其实这个指令我个人觉得还有待改进,而且难度也不算高,算是比较简单的额指令了。当初也是没找到合适的第三方才自己写了一个。之后还是会继续学习封装控件做成指令。分享出来给大家看看,指导指导。希望大家看到有问题的直接评论或者私信我给我指正。谢谢

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容