• angular 实现时间段选择组件


    前段时间公司有个后台项目需要使用一个选择时间段的组件,看了一下就自己写了一下,用angular写这种插件还是很简单的。

    先看看最终是什么样子的:

    时间段选择

    功能是用户可以选择任意时间段,鼠标可以拖动任意的一周的时间段,松开鼠标结束选择。
    话不多说,下面上代码:
    页面结构大体是这样的。

    	<div class="gb-timearr-box" ng-controller="Timearr">
    		<div class="cont-box">
    
    			<div class="top">
    				<div class="left">
    					<span class="days">
    						时间
    					</span>
    					<span class="week">
    						星期
    					</span>
    				</div>
    				<div class="right">
    				    <p><span>上午</span><span>下午</span></p>
    				    <ul>
    				    	<li ng-repeat='item in timearr.days '>{{item}}</li>
    				    </ul>
    				</div>
    			</div>
    			<div class="week-box">
    				<ul ng-repeat="arr in timearr.timecont.all" ng-mousedown="downul($index)" ng-mouseup="mouseupul($index)" ng-mouseleave="mouseleaveul($index)">
    					<li ng-click="celectTime(arr.week)">星期{{arr.week}}</li>
    					<li ng-repeat="item in arr.time" ng-class="{true:'cur',false:''}[item.ok]" ng-click="celectTime(arr.week,$index)" ng-mouseleave="mouseenterli($index)" data-time="{{item.num}}"></li>
    				</ul>
    			</div>
    
    
    		</div>
    
    	</div>
    

    js:

        <script type="text/javascript" src="../angular.js"></script>
    	<script type="text/javascript">
    		var app = angular.module('app', []);
    
    		app.controller("Timearr",['$scope',function($scope){
    		    
    		    $scope.timearr = {
    		        days:[],
    		        duo:false,
    		        ulindex:"",
    		        timecont:{
    		            all : [
    		                {
    		                    week:'一',
    		                    time:[
    		                        {ok:false,num:"0"},{ok:false,num:"0.30"},{ok:false,num:"1"},{ok:false,num:"1.30"},{ok:false,num:"2"},{ok:false,num:"2.30"},{ok:false,num:"3"},{ok:false,num:"3.30"},{ok:false,num:"4"},{ok:false,num:"4.30"},{ok:false,num:"5"},{ok:false,num:"5.30"},{ok:false,num:"6"},{ok:false,num:"6.30"},{ok:false,num:"7"},{ok:false,num:"7.30"},{ok:false,num:"8"},{ok:false,num:"8.30"},{ok:false,num:"9"},{ok:false,num:"9.30"},{ok:false,num:"10"},{ok:false,num:"10.30"},{ok:false,num:"11"},{ok:false,num:"11.30"},{ok:false,num:"12"},{ok:false,num:"12.30"},{ok:false,num:"13"},{ok:false,num:"13.30"},{ok:false,num:"14"},{ok:false,num:"14.30"},{ok:false,num:"15"},{ok:false,num:"15.30"},{ok:false,num:"16"},{ok:false,num:"16.30"},{ok:false,num:"17"},{ok:false,num:"17.30"},{ok:false,num:"18"},{ok:false,num:"18.30"},{ok:false,num:"19"},{ok:false,num:"19.30"},{ok:false,num:"20"},{ok:false,num:"20.30"},{ok:false,num:"21"},{ok:false,num:"21.30"},{ok:false,num:"22"},{ok:false,num:"22.30"},{ok:false,num:"23"},{ok:false,num:"23.30"}
    		                    ]
    		                },
    		                {
    		                    week:'二',
    		                    time:[
    		                        {ok:false,num:"0"},{ok:false,num:"0.30"},{ok:false,num:"1"},{ok:false,num:"1.30"},{ok:false,num:"2"},{ok:false,num:"2.30"},{ok:false,num:"3"},{ok:false,num:"3.30"},{ok:false,num:"4"},{ok:false,num:"4.30"},{ok:false,num:"5"},{ok:false,num:"5.30"},{ok:false,num:"6"},{ok:false,num:"6.30"},{ok:false,num:"7"},{ok:false,num:"7.30"},{ok:false,num:"8"},{ok:false,num:"8.30"},{ok:false,num:"9"},{ok:false,num:"9.30"},{ok:false,num:"10"},{ok:false,num:"10.30"},{ok:false,num:"11"},{ok:false,num:"11.30"},{ok:false,num:"12"},{ok:false,num:"12.30"},{ok:false,num:"13"},{ok:false,num:"13.30"},{ok:false,num:"14"},{ok:false,num:"14.30"},{ok:false,num:"15"},{ok:false,num:"15.30"},{ok:false,num:"16"},{ok:false,num:"16.30"},{ok:false,num:"17"},{ok:false,num:"17.30"},{ok:false,num:"18"},{ok:false,num:"18.30"},{ok:false,num:"19"},{ok:false,num:"19.30"},{ok:false,num:"20"},{ok:false,num:"20.30"},{ok:false,num:"21"},{ok:false,num:"21.30"},{ok:false,num:"22"},{ok:false,num:"22.30"},{ok:false,num:"23"},{ok:false,num:"23.30"}
    		                    ]
    		                },
    		                {
    		                    week:'三',
    		                    time:[
    		                        {ok:false,num:"0"},{ok:false,num:"0.30"},{ok:false,num:"1"},{ok:false,num:"1.30"},{ok:false,num:"2"},{ok:false,num:"2.30"},{ok:false,num:"3"},{ok:false,num:"3.30"},{ok:false,num:"4"},{ok:false,num:"4.30"},{ok:false,num:"5"},{ok:false,num:"5.30"},{ok:false,num:"6"},{ok:false,num:"6.30"},{ok:false,num:"7"},{ok:false,num:"7.30"},{ok:false,num:"8"},{ok:false,num:"8.30"},{ok:false,num:"9"},{ok:false,num:"9.30"},{ok:false,num:"10"},{ok:false,num:"10.30"},{ok:false,num:"11"},{ok:false,num:"11.30"},{ok:false,num:"12"},{ok:false,num:"12.30"},{ok:false,num:"13"},{ok:false,num:"13.30"},{ok:false,num:"14"},{ok:false,num:"14.30"},{ok:false,num:"15"},{ok:false,num:"15.30"},{ok:false,num:"16"},{ok:false,num:"16.30"},{ok:false,num:"17"},{ok:false,num:"17.30"},{ok:false,num:"18"},{ok:false,num:"18.30"},{ok:false,num:"19"},{ok:false,num:"19.30"},{ok:false,num:"20"},{ok:false,num:"20.30"},{ok:false,num:"21"},{ok:false,num:"21.30"},{ok:false,num:"22"},{ok:false,num:"22.30"},{ok:false,num:"23"},{ok:false,num:"23.30"}
    		                    ]
    		                },
    		                {
    		                    week:'四',
    		                    time:[
    		                        {ok:false,num:"0"},{ok:false,num:"0.30"},{ok:false,num:"1"},{ok:false,num:"1.30"},{ok:false,num:"2"},{ok:false,num:"2.30"},{ok:false,num:"3"},{ok:false,num:"3.30"},{ok:false,num:"4"},{ok:false,num:"4.30"},{ok:false,num:"5"},{ok:false,num:"5.30"},{ok:false,num:"6"},{ok:false,num:"6.30"},{ok:false,num:"7"},{ok:false,num:"7.30"},{ok:false,num:"8"},{ok:false,num:"8.30"},{ok:false,num:"9"},{ok:false,num:"9.30"},{ok:false,num:"10"},{ok:false,num:"10.30"},{ok:false,num:"11"},{ok:false,num:"11.30"},{ok:false,num:"12"},{ok:false,num:"12.30"},{ok:false,num:"13"},{ok:false,num:"13.30"},{ok:false,num:"14"},{ok:false,num:"14.30"},{ok:false,num:"15"},{ok:false,num:"15.30"},{ok:false,num:"16"},{ok:false,num:"16.30"},{ok:false,num:"17"},{ok:false,num:"17.30"},{ok:false,num:"18"},{ok:false,num:"18.30"},{ok:false,num:"19"},{ok:false,num:"19.30"},{ok:false,num:"20"},{ok:false,num:"20.30"},{ok:false,num:"21"},{ok:false,num:"21.30"},{ok:false,num:"22"},{ok:false,num:"22.30"},{ok:false,num:"23"},{ok:false,num:"23.30"}
    		                    ]
    		                },
    		                {
    		                    week:'五',
    		                    time:[
    		                        {ok:false,num:"0"},{ok:false,num:"0.30"},{ok:false,num:"1"},{ok:false,num:"1.30"},{ok:false,num:"2"},{ok:false,num:"2.30"},{ok:false,num:"3"},{ok:false,num:"3.30"},{ok:false,num:"4"},{ok:false,num:"4.30"},{ok:false,num:"5"},{ok:false,num:"5.30"},{ok:false,num:"6"},{ok:false,num:"6.30"},{ok:false,num:"7"},{ok:false,num:"7.30"},{ok:false,num:"8"},{ok:false,num:"8.30"},{ok:false,num:"9"},{ok:false,num:"9.30"},{ok:false,num:"10"},{ok:false,num:"10.30"},{ok:false,num:"11"},{ok:false,num:"11.30"},{ok:false,num:"12"},{ok:false,num:"12.30"},{ok:false,num:"13"},{ok:false,num:"13.30"},{ok:false,num:"14"},{ok:false,num:"14.30"},{ok:false,num:"15"},{ok:false,num:"15.30"},{ok:false,num:"16"},{ok:false,num:"16.30"},{ok:false,num:"17"},{ok:false,num:"17.30"},{ok:false,num:"18"},{ok:false,num:"18.30"},{ok:false,num:"19"},{ok:false,num:"19.30"},{ok:false,num:"20"},{ok:false,num:"20.30"},{ok:false,num:"21"},{ok:false,num:"21.30"},{ok:false,num:"22"},{ok:false,num:"22.30"},{ok:false,num:"23"},{ok:false,num:"23.30"}
    		                    ]
    		                },
    		                {
    		                    week:'六',
    		                    time:[
    		                        {ok:false,num:"0"},{ok:false,num:"0.30"},{ok:false,num:"1"},{ok:false,num:"1.30"},{ok:false,num:"2"},{ok:false,num:"2.30"},{ok:false,num:"3"},{ok:false,num:"3.30"},{ok:false,num:"4"},{ok:false,num:"4.30"},{ok:false,num:"5"},{ok:false,num:"5.30"},{ok:false,num:"6"},{ok:false,num:"6.30"},{ok:false,num:"7"},{ok:false,num:"7.30"},{ok:false,num:"8"},{ok:false,num:"8.30"},{ok:false,num:"9"},{ok:false,num:"9.30"},{ok:false,num:"10"},{ok:false,num:"10.30"},{ok:false,num:"11"},{ok:false,num:"11.30"},{ok:false,num:"12"},{ok:false,num:"12.30"},{ok:false,num:"13"},{ok:false,num:"13.30"},{ok:false,num:"14"},{ok:false,num:"14.30"},{ok:false,num:"15"},{ok:false,num:"15.30"},{ok:false,num:"16"},{ok:false,num:"16.30"},{ok:false,num:"17"},{ok:false,num:"17.30"},{ok:false,num:"18"},{ok:false,num:"18.30"},{ok:false,num:"19"},{ok:false,num:"19.30"},{ok:false,num:"20"},{ok:false,num:"20.30"},{ok:false,num:"21"},{ok:false,num:"21.30"},{ok:false,num:"22"},{ok:false,num:"22.30"},{ok:false,num:"23"},{ok:false,num:"23.30"}
    		                    ]
    		                },
    		                {
    		                    week:'七',
    		                    time:[
    		                        {ok:false,num:"0"},{ok:false,num:"0.30"},{ok:false,num:"1"},{ok:false,num:"1.30"},{ok:false,num:"2"},{ok:false,num:"2.30"},{ok:false,num:"3"},{ok:false,num:"3.30"},{ok:false,num:"4"},{ok:false,num:"4.30"},{ok:false,num:"5"},{ok:false,num:"5.30"},{ok:false,num:"6"},{ok:false,num:"6.30"},{ok:false,num:"7"},{ok:false,num:"7.30"},{ok:false,num:"8"},{ok:false,num:"8.30"},{ok:false,num:"9"},{ok:false,num:"9.30"},{ok:false,num:"10"},{ok:false,num:"10.30"},{ok:false,num:"11"},{ok:false,num:"11.30"},{ok:false,num:"12"},{ok:false,num:"12.30"},{ok:false,num:"13"},{ok:false,num:"13.30"},{ok:false,num:"14"},{ok:false,num:"14.30"},{ok:false,num:"15"},{ok:false,num:"15.30"},{ok:false,num:"16"},{ok:false,num:"16.30"},{ok:false,num:"17"},{ok:false,num:"17.30"},{ok:false,num:"18"},{ok:false,num:"18.30"},{ok:false,num:"19"},{ok:false,num:"19.30"},{ok:false,num:"20"},{ok:false,num:"20.30"},{ok:false,num:"21"},{ok:false,num:"21.30"},{ok:false,num:"22"},{ok:false,num:"22.30"},{ok:false,num:"23"},{ok:false,num:"23.30"}
    		                    ]
    		                },
    		                
    		            ],
    		            cur : []
    		        },
    		        selecTime : function(w,curindex){
    
    		            var all = $scope.timearr.timecont.all,
    		                cur = [],
    		                curarr = $scope.timearr.timecont.cur;
    
    		            for(var i = 0;i < all.length; i++){
    
    		                if(all[i].week == w){
    		      
    		                    if(curindex){
    		                       all[i].time[curindex].ok = !all[i].time[curindex].ok; 
    		                    }else{
    		                       for(var s = 0;s < all[i].time.length;s++){
    		                            all[i].time[s].ok = !all[i].time[s].ok;
    		                       } 
    		                    }
    
    		                }
    		                
    		                for(var j=0;j<all[i].time.length;j++){
    
    		                    var obj = {};
    		                    if(all[i].time[j].ok){
    		                        obj.week = all[i].week;
    		                        obj.time = all[i].time[j].num;
    		                        cur.push(obj);
    		                    }
    		                }
    		                
    		            }
    
    		            var arr1 = [{week:"一",time:[]},{week:"二",time:[]},{week:"三",time:[]},{week:"四",time:[]},{week:"五",time:[]},{week:"六",time:[]},{week:"七",time:[]},];
    
    		            for(var d = 0;d < cur.length; d++){
    		                for(var a = 0; a<arr1.length;a++){
    		                    if(cur[d].week == arr1[a].week){
    		                        arr1[a].time.push(cur[d].time);
    		                    }
    		                }
    		            }
    
    		            curarr = arr1;
    
    		            console.log(curarr);
    
    
    		        },
    		        downul:function(i){
    		            $scope.timearr.duo = true;
    		            $scope.timearr.ulindex = i;
    		            console.log(i);
    		        },
    		        mouseenterli:function(i){
    		        	
    		        	if($scope.timearr.duo){
    		        		$scope.timearr.timecont.all[$scope.timearr.ulindex].time[i].ok = !$scope.timearr.timecont.all[$scope.timearr.ulindex].time[i].ok;
    		        	}
    		        },
    		        mouseupul:function(i){
    		        	$scope.timearr.duo = false;
    		        },
    		        mouseleaveul:function(i){
    		        	if(i == $scope.timearr.ulindex){
    		        		$scope.timearr.duo = false;
    		        	}else{
    		        		$scope.timearr.duo = false;
    		        	}
    		        	
    		        }
    
    
    
    		    };
    		    $scope.timearr.days = ["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23"];
    
    		    $scope.celectTime = $scope.timearr.selecTime;
    		    $scope.downul = $scope.timearr.downul;
    		    $scope.mouseenterli = $scope.timearr.mouseenterli;
    		    $scope.mouseupul = $scope.timearr.mouseupul;
    		    $scope.mouseleaveul = $scope.timearr.mouseleaveul;
    
    		}])
    	</script>
    

    我模拟的数据比较臃肿,其实还可以将 $scope.timearr 简化一下的,这个组件主要靠的就是 $scope.timearr 记录用户选择的时间段,然后输出给后台。

    这里有几个事件我也是第一次用,angular的 ng-mousedownng-mouseupng-mouseleave,用起来还是有些问题的,比如用户按下鼠标左键的时候,快速选择时间段的话,有的时间点就没有记录下来,这个问题的关键是用户选择的时候速度过快,以至于代码还没有将鼠标滑过的数据改变,已经滑过下一个了。

    解决的办法有一个,就是速度不要过快。哈哈哈!

    最后贡献一下我的代码:https://github.com/wangbaogui123/learn.git

    奔跑的工程师
  • 相关阅读:
    面向对象程序设计寒假作业3
    面向对象程序设计编程题完善1.0
    jq分片上传,可拖动上传
    给富文本框的头添加title
    vue的富文本编辑器使用,并且添加显示当前输入字数
    超出省略号
    关于缓存 windwo.localStorage和sessionStorage
    复制框里的内容
    同一标签添加多个背景图
    函数里添加超链接
  • 原文地址:https://www.cnblogs.com/wbg21521/p/6774434.html
Copyright © 2020-2023  润新知