Skip to content
This repository was archived by the owner on May 29, 2019. It is now read-only.

Commit b72efed

Browse files
RobJacobswesleycho
authored andcommitted
refactor(datepicker): implement ng-if on datepicker-popup
Implementing ng-if on the datepicker-popup directive for performance. Closes #1915 Closes #3666
1 parent dbceec7 commit b72efed

File tree

3 files changed

+87
-70
lines changed

3 files changed

+87
-70
lines changed

src/datepicker/datepicker.js

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
1818
shortcutPropagation: false
1919
})
2020

21-
.controller('DatepickerController', ['$scope', '$attrs', '$parse', '$interpolate', '$timeout', '$log', 'dateFilter', 'datepickerConfig', function($scope, $attrs, $parse, $interpolate, $timeout, $log, dateFilter, datepickerConfig) {
21+
.controller('DatepickerController', ['$scope', '$attrs', '$parse', '$interpolate', '$log', 'dateFilter', 'datepickerConfig', function($scope, $attrs, $parse, $interpolate, $log, dateFilter, datepickerConfig) {
2222
var self = this,
2323
ngModelCtrl = { $setViewValue: angular.noop }; // nullModelCtrl;
2424

@@ -161,9 +161,7 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
161161
$scope.keys = { 13:'enter', 32:'space', 33:'pageup', 34:'pagedown', 35:'end', 36:'home', 37:'left', 38:'up', 39:'right', 40:'down' };
162162

163163
var focusElement = function() {
164-
$timeout(function() {
165-
self.element[0].focus();
166-
}, 0 , false);
164+
self.element[0].focus();
167165
};
168166

169167
// Listen for focus requests from popup directive
@@ -460,8 +458,8 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst
460458
showButtonBar: true
461459
})
462460

463-
.directive('datepickerPopup', ['$compile', '$parse', '$document', '$position', 'dateFilter', 'dateParser', 'datepickerPopupConfig',
464-
function ($compile, $parse, $document, $position, dateFilter, dateParser, datepickerPopupConfig) {
461+
.directive('datepickerPopup', ['$compile', '$parse', '$document', '$position', 'dateFilter', 'dateParser', 'datepickerPopupConfig', '$timeout',
462+
function ($compile, $parse, $document, $position, dateFilter, dateParser, datepickerPopupConfig, $timeout) {
465463
return {
466464
restrict: 'EA',
467465
require: 'ngModel',
@@ -517,7 +515,7 @@ function ($compile, $parse, $document, $position, dateFilter, dateParser, datepi
517515
var popupEl = angular.element('<div datepicker-popup-wrap><div datepicker></div></div>');
518516
popupEl.attr({
519517
'ng-model': 'date',
520-
'ng-change': 'dateSelection()'
518+
'ng-change': 'dateSelection(date)'
521519
});
522520

523521
function cameltoDash( string ){
@@ -661,30 +659,41 @@ function ($compile, $parse, $document, $position, dateFilter, dateParser, datepi
661659
}
662660
};
663661

664-
var keydown = function(evt, noApply) {
665-
scope.keydown(evt);
662+
var inputKeydownBind = function(evt) {
663+
if (evt.which === 27 && scope.isOpen) {
664+
evt.preventDefault();
665+
evt.stopPropagation();
666+
scope.$apply(function() {
667+
scope.isOpen = false;
668+
});
669+
element[0].focus();
670+
} else if (evt.which === 40 && !scope.isOpen) {
671+
evt.preventDefault();
672+
evt.stopPropagation();
673+
scope.$apply(function() {
674+
scope.isOpen = true;
675+
});
676+
}
666677
};
667-
element.bind('keydown', keydown);
678+
element.bind('keydown', inputKeydownBind);
668679

669680
scope.keydown = function(evt) {
670681
if (evt.which === 27) {
671-
evt.preventDefault();
672-
if (scope.isOpen) {
673-
evt.stopPropagation();
674-
}
675-
scope.close();
676-
} else if (evt.which === 40 && !scope.isOpen) {
677-
scope.isOpen = true;
682+
scope.isOpen = false;
683+
element[0].focus();
678684
}
679685
};
680686

681687
scope.$watch('isOpen', function(value) {
682688
if (value) {
683-
scope.$broadcast('datepicker.focus');
684689
scope.position = appendToBody ? $position.offset(element) : $position.position(element);
685690
scope.position.top = scope.position.top + element.prop('offsetHeight');
686691

687692
$document.bind('click', documentClickBind);
693+
694+
$timeout(function() {
695+
scope.$broadcast('datepicker.focus');
696+
}, 0, false);
688697
} else {
689698
$document.unbind('click', documentClickBind);
690699
}
@@ -719,8 +728,14 @@ function ($compile, $parse, $document, $position, dateFilter, dateParser, datepi
719728
}
720729

721730
scope.$on('$destroy', function() {
731+
if (scope.isOpen === true) {
732+
scope.$apply(function() {
733+
scope.isOpen = false;
734+
});
735+
}
736+
722737
$popup.remove();
723-
element.unbind('keydown', keydown);
738+
element.unbind('keydown', inputKeydownBind);
724739
$document.unbind('click', documentClickBind);
725740
});
726741
}
@@ -732,12 +747,6 @@ function ($compile, $parse, $document, $position, dateFilter, dateParser, datepi
732747
restrict:'EA',
733748
replace: true,
734749
transclude: true,
735-
templateUrl: 'template/datepicker/popup.html',
736-
link:function (scope, element, attrs) {
737-
element.bind('click', function(event) {
738-
event.preventDefault();
739-
event.stopPropagation();
740-
});
741-
}
750+
templateUrl: 'template/datepicker/popup.html'
742751
};
743752
});

0 commit comments

Comments
 (0)