Let's say you want to get the selected date in your controller and do something with it:
Add this to your controller:
$rootScope.$watch('datepickerDateSelected', function(date){
    // do whatever you want with the date parameter here
});
And modify the datepicker directive $scope.select method, like this:
scope.$select = function (date) {
    $rootScope.datepickerDateSelected = date; // ADD THIS
    $datepicker.select(date);
};
[ UPDATE ]
Using $broadcast/$on. Modify the directive ($datepicker.show and $datepicker.hide methods) like this:
$datepicker.show = function(){
    ...
    $rootScope.$broadcast('opening'); // ADD THIS
    ...
}
 $datepicker.hide= function(blur){
    ...
    $rootScope.$broadcast('closing'); // ADD THIS
    ...
}
And in your controller, add this (you don't need to $watch anything):
$rootScope.$on('opening', function(event, data) { console.log("it's opening!"); });
$rootScope.$on('closing', function(event, data) { console.log("it's closing!"); });
It worked in my case, but you may want to check this: Working with $scope.$emit and $scope.$on (see answer from zbynour)
If you don't want to use $broadcast/$on (see the comments), just use $watch like in the first example instead.