@pavtaras

Как правильно наследовать контроллер в angular?

Суть вопроса. Есть два контроллера:
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'). Или вообще какой-нибудь другой, более совершенный способ наследования?

Спасибо.
  • Вопрос задан
  • 850 просмотров
Решения вопроса 1
@napa3um
function AppCtrl($scope, $controller) {
  $controller('AbstractCtrl', { $scope: $scope });
}

// или

function AppCtrl($controller) {
  $controller('AbstractCtrl', { vm: this });
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@pavtaras Автор вопроса
Сам вижу как вариант написать фабрику, которая возвращает нужную функцию, которую можно в контроллер в дальнейшем заинджектить и вызвать через .call. Но это какой-то костыль и не подходит для неабстрактных контроллеров
Ответ написан
Комментировать
@yociyavi
Вынесите общий функционал в сервис, и в каждом контроллере смержите этот сервис с this контроллера
Ответ написан
ogarich89
@ogarich89
Front-End Developer
Если нужна общая функция для множества контроллеров создавай фабрику
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы