Суть вопроса. Есть два контроллера:
angular.module('app', [])
.controller('AbstractCtrl', AbstractCtrl)
.controller('AppCtrl', AppCtrl);
Код абстрактного контроллера оставим неизменным:
function AbstractCtrl(){
var self = this;
self.name = "Vova";
self.init = function(){
self.name = "Petya";
};
}
А вот второй контроллер унаследуем двумя способами и вызовем инициализацию:
способ №1:function AppCtrl($controller){
var vm = this;
angular.extend(vm, $controller('AbstractCtrl', {}));
vm.init();
}
способ №2:function AppCtrl(){
var vm = this;
AbstractCtrl.call(this);
vm.init();
}
Разница есть и существенная. После инициализации контроллера унаследованного первым способом у нас будет имя Vova, вторым способом - Petya. Понятно, что ожидаем Петю. И понятно, что данный абстрактный контроллер здесь можно переписать так, что оба раза будет Петя. Но переписывать не годится, тем более, что код является корректным.
Итого, наследование вторым способом мне кажется более универсальным. Но зачастую разработчики пишут контроллеры:
а) анонимными функциями и нету возможности
б) разделяют код по файлам да еще используют самовызывающиеся функции, чтобы не засорять глобальный скоуп. Как результат в файле другого контроллера мы не видим нужной функции и отнаследовать не можем. Можно хранить, например в window.controllers коллекцию всех контроллеров, но это видится гемором.
Как выходить из такого положения? Может есть в angular какой-то геттер, который позволит получить функцию контроллера? Например, angular.get('AbstractCtrl'). Или вообще какой-нибудь другой, более совершенный способ наследования?
Спасибо.