The "Angular Way" is based on several principles:
Single Responsibility Principle Each component should have only one well-defined role.
Principle of Least Knowledge A given component should assume as little as possible about the structure or properties of anything else.
Principle of Least Surprise People are part of the system. The design should match the user's experience, expectations, and mental models.
Some other stuff from OOD can be applied too, but with limitations.
The goal of "the Angular Way" is to make each component maximally deterministic, cohesive and independent and to promote the component composability.
This means that every component has a well-defined and simple role in the system.
When working on a single module in parallel, all you need to know is how to communicate with your teammate's component (the contract, or interface, of his component).
The contracts are:
- Directive's attributes
- Controller's $scope bindings
- Service's methods
Each component should have only limited amount of knowledge about its context.
Each component should have only one responsibility and, thus, the only one reason to change.
AngularJS let you write your code in declarative way: you write "what" your system should do, and not "how" it should do the stuff.
If you stick to "the Angular Way" and declarative approach in your design, you will be able to work with each distinct component independently and in a very limited context.
This means, that you won't lurk through the code of all dependencies trying to find what events should be listened to, and what those dependencies are doing, and how all that stuff is related to your current task.