На самом деле не работает ни один из вариантов.
Просто ваша директива получает в качестве контроллера функцию mailListCtrl, которую вы и объявили в 3 варианте.
Оберните название контроллера в кавычки:
mailApp.directive('mailList', function(){
return {
restrict: 'E',
templateUrl: 'mailListDirective.html',
controller: 'mailListCtrl',
// replace: true,
controllerAs: 'mailListCtrl'
};
});
Еще лучше, если вы начнете использовать
компоненты, появившиеся в Angular 1.5+
А вот
стартовый шаблон, использующий вебпак для сборки и синтаксис ES6, так выглядит современное приложение на Angular 1.