基于datetimepicker封裝的dateRange指令
1.需要npm引入
npm install angular-bootstrap-datetimepicker --save
2.加载:module
angular.module('app', [ui.bootstrap.datetimepicker])3.JS:
angular.module('app').directive('dateRange', function() {
return {
restrict : 'EA',
replace: true,
scope: {
startDate: '=',
endDate: '=',
startId: '@',
endId: '@'
},
template : '<div class="date-box-vms">' +
'<div class="dropdown">' +
'<a class="dropdown-toggle" id="{{startId}}" role="button" data-toggle="dropdown" data-target="#" href="#">' +
'<div class="input-append date input-group">' +
'<span class="add-on"><i class="icon-th"><img class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="/styles/img/icon/icon_cal.png" alt=""></i></span>' +
'<input type="text" class="date-style" data-ng-model="startDate" placeholder="{{\'START_TIME\' | translate}}">' +
'</div>' +
'</a>' +
'<ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">' +
'<div>' +
'<datetimepicker data-ng-model="startDate"' +
'data-datetimepicker-config="{ dropdownSelector: \'#\'+startId, renderOn: \'end-date-changed\' ,minView:\'day\',modelType: \'YYYY-MM-DD\'}"' +
'data-on-set-time="startDateOnSetTime()"' +
'data-before-render="startDateBeforeRender($view, $dates)"/>' +
'</div>' +
'<div>' +
'<button class="btn btn-default-vms" ng-click="startToday()">{{ \'BTN_TODAY\' | translate }}</button>' +
'<button class="btn btn-default-vms" ng-click="clearStartDate()">{{ \'BTN_CLEAR\' | translate }}</button>' +
'</div>' +
'</ul>' +
'</div>' +
'<span><img class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="styles/img/icon/xian.png" alt=""></span>' +
'<div class="dropdown">' +
'<a class="dropdown-toggle" id="{{endId}}" role="button" data-toggle="dropdown" data-target="#" href="#">' +
'<div class="input-append date input-group">' +
'<span class="add-on"><i class="icon-th"><img class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="/styles/img/icon/icon_cal.png" alt=""></i></span>' +
'<input type="text" class="date-style" data-ng-model="endDate" placeholder="{{\'END_TIME\' | translate}}">' +
'</div>' +
'</a>' +
'<ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">' +
'<div>' +
'<datetimepicker data-ng-model="endDate"' +
'data-datetimepicker-config="{ dropdownSelector: \'#\'+endId, renderOn: \'start-date-changed\',minView:\'day\',modelType: \'YYYY-MM-DD\'}"' +
'data-on-set-time="endDateOnSetTime()"' +
'data-before-render="endDateBeforeRender($view, $dates, $leftDate, $upDate, $rightDate)">' +
'</div>' +
'<div>' +
'<button class="btn btn-default-vms" ng-click="endToday()">{{ \'BTN_TODAY\' | translate }}</button>' +
'<button class="btn btn-default-vms" ng-click="clearEndDate()">{{ \'BTN_CLEAR\' | translate }}</button>' +
'</div>' +
'</ul>' +
'</div>' +
'</div>',
controller : function($scope) {
//时间组件
$scope.endDateBeforeRender = endDateBeforeRender;
$scope.endDateOnSetTime = endDateOnSetTime;
$scope.startDateBeforeRender = startDateBeforeRender;
$scope.startDateOnSetTime = startDateOnSetTime;
$scope.startToday = startToday;
$scope.endToday = endToday;
$scope.clearStartDate = clearStartDate;
$scope.clearEndDate = clearEndDate;
$scope.nowDate = moment(new Date).format('YYYY-MM-DD');
$scope.endId = _.isEmpty($scope.endId)? 'endTime':$scope.endId;
$scope.startId = _.isEmpty($scope.startId)? 'startTime':$scope.startId;
function startDateOnSetTime () {
$scope.$broadcast('start-date-changed');
}
function endDateOnSetTime () {
$scope.$broadcast('end-date-changed');
}
function startDateBeforeRender ($view, $dates) {
if ($scope.endDate) {
let activeDate = moment($scope.endDate).add(1, $view).subtract(1, 'minute');
$dates.filter(function (date) {
return date.localDateValue() >= activeDate.valueOf()
}).forEach(function (date) {
date.selectable = false;
})
}
}
function endDateBeforeRender ($view, $dates) {
if ($scope.startDate) {
let activeDate = moment($scope.startDate).subtract(1, $view).add(1, 'minute');
$dates.filter(function (date) {
return date.localDateValue() <= activeDate.valueOf()
}).forEach(function (date) {
date.selectable = false;
})
}
}
function startToday (){
$scope.startDate = $scope.nowDate;
$scope.$broadcast('start-date-changed');
}
function endToday (){
$scope.endDate = $scope.nowDate;
$scope.$broadcast('end-date-changed');
}
function clearStartDate (){
$scope.startDate ='';
$scope.$broadcast('start-date-changed');
}
function clearEndDate (){
$scope.endDate ='';
$scope.$broadcast('end-date-changed');
}
}
}
});4.HTML:
<div ng-controller="myCtrl as $ctrl"> <date-range start-id="expectStart" end-id="expectEnd" start-date="$ctrl.startTime" end-date="$ctrl.endTime"></date-range> </div>
引入id是为了区分组件,否则同一组件在同一页面,会出问题。可以试一下~
同理,单个时间控件可以是这样的写:
angular.module('app').directive('dateChose', function() {
return {
restrict : 'EA',
replace: true,
scope: {
date: '=',
id:'@',
required:'='
},
template : '<div class="date-box-vms">' +
'<div class="dropdown">' +
'<a class="dropdown-toggle" id="time_{{id}}" role="button" data-toggle="dropdown" data-target="#" href="#">' +
'<div class="input-append date input-group">' +
'<span class="add-on"><i class="icon-th"><img class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="styles/img/icon/icon_cal.png" alt=""></i></span>' +
'<input type="text" class="date-style" data-ng-model="date" ng-required="required">' +
'</div>' +
'</a>' +
'<ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">' +
'<div>' +
'<datetimepicker ng-model="date"' +
'datetimepicker-config="{ dropdownSelector: \'#time_\' + id,minView:\'day\',modelType: \'YYYY-MM-DD\'}"/>' +
'</div>' +
'<div>' +
'<button class="btn btn-default-vms" ng-click="Today()">{{ \'TODAY\' | translate }}</button>' +
'<button class="btn btn-default-vms" ng-click="clearDate()">{{ \'BTN_CLEAR\' | translate }}</button>' +
'</div>' +
'</ul>' +
'</div>' +
'</div>',
controller : function($scope) {
//时间组件
$scope.Today = Today;
$scope.clearDate = clearDate;
$scope.nowDate = moment(new Date).format('YYYY-MM-DD');
function Today (){
$scope.date = $scope.nowDate;
}
function clearDate (){
$scope.date ='';
}
}
}
})<date-chose date="$ctrl.time" required="true"></date-chose>
點擊查看更多內容
4人點贊
評論
評論
共同學習,寫下你的評論
評論加載中...
作者其他優質文章
正在加載中
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
