Currently we could monitor data changes with several ways. We could trigger model changes with $watch and we could add directives to elements and bind some acti
Directives like ng-change are used for data-binding to DOM. $watch is used in your JS code to listen for changes.
When you need to have the DOM be affected by a change in your scope, or need to have a change in DOM (eg. field selection) affect the scope, you would use a directive.
If you need to trigger JavaScript actions from a change in scope, for example an ajax request, then you would use $watch in your controller (or service) to listen for the change.