I would suggest you use $ broadcast between the controller to accomplish this, which seems to be a more angular way to communicate between parent / child controllers
The concept is simple, you look at the value in the parent controller, then when a modification occurs, you can translate it and intercept it in the child controller
Here is a fiddle demonstrating this: http://jsfiddle.net/DotDotDot/f733J/
The part in the parent controller is as follows:
$scope.$watch('overlaytype', function(newVal, oldVal){ if(newVal!=oldVal) $scope.$broadcast('overlaychange',{"val":newVal}) });
and in the child controller:
$scope.$on('overlaychange', function(event, args){ console.log("change detected")
A good point with this solution, if you want to see the changes in another child controller, you can just catch the same event
Good luck
Edit: I did not see the last edit, but my solution also works for the directive, I updated the previous fiddle ( http://jsfiddle.net/DotDotDot/f733J/1/ )
I changed your directive to make it create a child scope and create a controller:
directive('center',function($window){ return { restrict : "A", scope:true, controller:function($scope){ $scope.overlayChanged={"isChanged":"No","value":""}; $scope.$on('overlaychange', function(event, args){ console.log("change detected") //whatever you need to do }); }, link : function(scope,elem,attrs){ var resize = function() { var winHeight = $window.innerHeight - 90, overlayHeight = elem[0].offsetHeight, diff = (winHeight - overlayHeight) / 2; elem.css('top',diff+"px"); }; angular.element($window).bind('resize',function(e){ console.log(scope.$parent.data.overlaytype) resize(); }); } }; });