Se la direttiva si romperà senza il controller, quindi la direttiva dovrebbe definire il controller di cui ha bisogno. Ciò crea un'associazione one-to-one tra la direttiva e il controller.
Supponiamo di avere una direttiva "Booking" che necessita di "BookingController". È ridondante per lo sviluppatore specificare sia la direttiva che il controller ogni volta che è necessario utilizzare la direttiva di prenotazione. Quindi la direttiva può definire controller: "BookingController"
e AngularJS crea automaticamente un'istanza di quel controller quando viene utilizzata la direttiva.
Cosa succede se la vostra direttiva è generica? Hai una direttiva che gestisce solo la formattazione dell'ordine di prenotazione, ma ci sono molti controllori che gestiscono diversi tipi di prenotazioni. In questo caso, la direttiva non definirebbe il controller. Definirebbe solo ciò di cui ha bisogno "booking_number" nell'ambito corrente. Lo sviluppatore dovrebbe "usare" quella direttiva da qualche parte nel DOM "sotto" un controller che gestisce la prenotazione.
È meglio pensare alle direttive come codice che pubblica l'ambito corrente, ma non manipolare l'ambito corrente. I controller sono codici che manipolano l'ambito corrente, ma non sanno come viene pubblicato l'ambito. Views (o HTML) è dove queste due cose sono scattate insieme in ordine di dipendenze.