Unfortunately, the datepicker
directive datepicker
not have a binding for tracking month / year changes. This is what I came up with as a job.
In html ...
<datepicker month-changed="changeMonth($month, $year)" />
In the controller ...
$scope.changeMonth = function(month, year) { console.log(month, year);
Decorator
app.config(function($provide) { $provide.decorator('datepickerDirective', function($delegate) { var directive = $delegate[0], link = directive.link; angular.extend(directive.scope, { 'monthChanged': '&' }); directive.compile = function() { return function(scope, element, attrs, ctrl) { link.apply(this, arguments); scope.$watch(function() { return ctrl[0].activeDate.getTime(); }, function(newVal, oldVal) { if (scope.datepickerMode == 'day') { oldVal = moment(oldVal).format('MM-YYYY'); newVal = moment(newVal).format('MM-YYYY'); if (oldVal !== newVal) { var arr = newVal.split('-'); scope.monthChanged({ '$month': arr[0], '$year': arr[1] }); } } }); }; }; return $delegate; }); });
Another decorator
Here is another decorator that also works, but is probably a bit more resource intensive. Everything I do here overrides the isActive()
method already used in the directive, so the method is called instead. I just post this as an example of possible ways to circumvent some limitations in third-party directives. I do not necessarily recommend this solution.
app.config(function($provide) { $provide.decorator('datepickerDirective', function($delegate) { var directive = $delegate[0], link = directive.link; angular.extend(directive.scope, { 'monthChanged': '&' }); directive.compile = function() { return function(scope, element, attrs, ctrl) { link.apply(this, arguments); var activeMonth, activeYear, activeFn = scope.isActive; scope.isActive = function(dateObj) { if (scope.datepickerMode == 'day' && !dateObj.secondary) { var oldMonth = activeMonth, oldYear = activeYear, newMonth = dateObj.date.getMonth() + 1; newYear = dateObj.date.getFullYear(); if (oldMonth !== newMonth || oldYear !== newYear) { activeMonth = newMonth; activeYear = newYear; scope.monthChanged({ '$month': newMonth, '$year': newYear }); } } activeFn(dateObj); }; }; }; return $delegate; }); });