If we consider any directive as software components, such a component needs some input to work on, it produces some output and it may provide an API to manipulate its state.
Inputs to directives are provided in one or more forms using directive templates, parent scope, and dependencies on other directives.
Directive output could be behavior extension of an existing HTML element or the generation of new HTML content. The directive API is supported through directive controllers.
For a truly reusable component, all dependencies of a component should be externalized and explicitly stated. When a directive is dependent upon the parent scope for input (even when it creates a child scope), the dependency is implicit and hard to change/replace. Another side effect of an inherited scope is that a directive has access to the parent scope model and can manipulate it. This can lead to unintended bugs that are difficult to debug and fix.
Directive-isolated scopes can...