Внутри модуля контроллер может наследовать свойства от внешнего контроллера:
var app = angular.module('angularjs-starter', []);
var ParentCtrl = function ($scope, $location) {
};
app.controller('ChildCtrl', function($scope, $injector) {
$injector.invoke(ParentCtrl, this, {$scope: $scope});
});
Пример через: неработающая ссылка : http://blog.omkarpatil.com/2013/02/controller-inheritance-in-angularjs.html
Может ли контроллер внутри модуля наследовать от родного брата?
var app = angular.module('angularjs-starter', []);
app.controller('ParentCtrl ', function($scope) {
//I'm the sibling, but want to act as parent
});
app.controller('ChildCtrl', function($scope, $injector) {
$injector.invoke(ParentCtrl, this, {$scope: $scope}); //This does not work
});
Второй код не работает, так как $injector.invoke
требует функции в качестве первого параметра и не находит ссылку на ParentCtrl
.
angularjs
inheritance
angularjs-controller
Федерико Эллес
источник
источник
Ответы:
Да, это возможно, но вы должны использовать
$controller
сервис для создания экземпляра контроллера вместо: -источник
ParentCtrl
должно бытьcontroller
или можно использоватьservice
?$controller
можно использовать только зарегистрированные контроллеры.$scope
чтобыthis
(в теории)Если вы используете
vm
синтаксис контроллера , вот мое решение:К сожалению, вы не можете использовать
$controller.call(vm, 'BaseGenericCtrl'...)
, чтобы передать текущий контекст вreload()
функцию замыкания (for ), поэтому только одно решение - использоватьthis
внутри унаследованной функции для динамического изменения контекста.источник
vm
это просто переменная внутри контроллера, я не думаю, что Angular может использовать его как положено.Я думаю, вы должны использовать фабрику или сервис, чтобы предоставить доступные функции или данные для обоих контроллеров.
вот похожий вопрос ---> Наследование контроллера AngularJS
источник
loading
переменную, чтобы при загрузке данных я всегда делал одно и то же, я не думаю, что фабрики могут это делать. Мой родительский контроллер может иметь переменную загрузки, но фабрика не может манипулировать ею ... правильно ?!В ответ на вопрос, поднятый в этом ответе от gmontague , я нашел метод для наследования контроллера с помощью $ controller () и все еще использования контроллера «как» синтаксис.
Во-первых, используйте синтаксис «as» при наследовании вызова $ controller ():
Затем, в шаблоне HTML, если свойство определено родительским, тогда используйте
parent.
для извлечения свойств, унаследованных от родительского; если определено child, используйте егоchild.
для извлечения.источник
Ну, я сделал это по-другому. В моем случае я хотел функцию, которая применяет те же функции и свойства в других контроллерах. Мне понравилось, кроме параметров. Таким образом, все ваши ChildCtrls должны получить $ location.
источник
Для тех, кто интересуется, вы можете расширить компонентные контроллеры тем же способом, используя метод в принятом ответе.
Используйте следующий подход:
Родительский компонент (для расширения от):
Дочерний компонент (расширяющийся):
Хитрость заключается в том, чтобы использовать именованные контроллеры вместо определения их в определении компонента.
источник
Как упоминалось в принятом ответе, вы можете «наследовать» модификации родительского контроллера в $ scope и других сервисах, вызывая:
$controller('ParentCtrl', {$scope: $scope, etc: etc});
в вашем дочернем контроллере.Однако это не работает, если вы привыкли использовать контроллер как синтаксис, например, в
Если он
foo
был установлен в родительском контроллере (черезthis.foo = ...
), дочерний контроллер не будет иметь к нему доступа.Как уже упоминалось в комментариях, вы можете присвоить результат $ controller непосредственно области:
Примечание. Затем необходимо удалить часть «как»
ng-controller=
, поскольку вы указываете имя экземпляра в коде, а не шаблон.источник
Я использовал синтаксис «Контроллер как»
vm = this
и хотел наследовать контроллер. У меня были проблемы, если у моего родительского контроллера была функция, которая модифицировала переменную.Используя ответы IProblemFactory и Салмана Аббаса , я сделал следующее, чтобы получить доступ к родительским переменным:
источник
Вы можете использовать простой механизм наследования JavaScript. Также не забудьте передать необходимые угловые сервисы для вызова метода .call.
источник
Обратитесь к ниже указанной ссылке для наследования AngularJs feartue.
Контроллер-Наследование-в-angularjs
источник