I've touched on this idea before, in my AngularJS directive mindset post; but, I've seen this happen so many times that I wanted to call it out again, as its own concept. If you define $scope methods inside of your AngularJS directives, you might want to consider this a "code smell." Take a moment to think about what that method is doing and consider moving it into the parent Controller or Service.
NOTE: This does not necessarily apply to AngularJS directives that use the Isolate scope.
If you find that you are defining $scope methods in your Directives, you're not facilitating communication - you're exposing behavior to the View. Probably, what you want to do is move that $scope method into the parent Controller and then either invoke it directly in the View; or, create an event handler in the Directive that turns around and consumes said $scope method (calling $apply(), $evalAsync(), or $digest() as needed).
This code smell is based on my own experience with AngularJS and the type of directives that I have written. As my applications evolve, I can feel the pain points of poor decision making. And, to me, defining behavior in my Directives has caused pain when it comes to maintaining and refactoring my AngularJS code. Your mileage may vary.