Pensez à un module comme étant un endroit pour câbler un certain nombre d'autres choses, telles que des directives, des services, des constantes, etc. Les modules peuvent être injectés dans d'autres modules vous donnant un niveau élevé de réutilisation.
Lors de l'écriture d'une application angulaire, vous auriez un module de niveau supérieur qui est votre code d'application (sans modèles).
Les services sont principalement un moyen de communiquer entre les contrôleurs, mais vous pouvez injecter un service dans un autre. Les services sont souvent utilisés pour accéder à vos magasins de données et les gens encapsuleront les API angulaires, telles que ngResource. Cette technique est utile car elle rend les tests (en particulier les moqueurs) assez faciles. Vous pouvez avoir des services pour faire d'autres choses comme l'authentification, la journalisation, etc.
Les directives sont utilisées pour créer des widgets ou encapsuler des éléments existants tels que les plugins jquery. L'emballage des plugins existants peut être un défi et la raison pour laquelle vous le feriez est d'établir une liaison de données bidirectionnelle entre les plugins et angular. Si vous n'avez pas besoin de liaison de données bidirectionnelle, vous n'avez pas besoin de les encapsuler.
Une directive est également un endroit pour faire des manipulations DOM, attraper des événements DOM, etc. Vous ne devriez pas faire de choses liées au DOM dans des contrôleurs ou des services. La création de directives peut devenir assez complexe. À mon humble avis, je recommande d'abord de regarder l'API pour quelque chose qui peut faire ce que vous recherchez OU de demander conseil au groupe Google d'Angular.