У меня есть три контроллера, которые очень похожи. Я хочу иметь контроллер, который расширяет эти три функции и разделяет их функции.
источник
У меня есть три контроллера, которые очень похожи. Я хочу иметь контроллер, который расширяет эти три функции и разделяет их функции.
Возможно, вы не расширяете контроллер, но возможно расширить контроллер или сделать один контроллер смесью нескольких контроллеров.
module.controller('CtrlImplAdvanced', ['$scope', '$controller', function ($scope, $controller) {
// Initialize the super class and extend it.
angular.extend(this, $controller('CtrlImpl', {$scope: $scope}));
… Additional extensions to create a mixin.
}]);
Когда родительский контроллер создан, логика, содержащаяся в нем, также выполняется. См. $ Controller () для получения дополнительной информации, но $scope
нужно передать только значение. Все остальные значения будут введены нормально.
@mwarren , ваше беспокойство автоматически решается с помощью инъекции угловой зависимости. Все, что вам нужно, это ввести $ scope, хотя при желании вы можете переопределить другие введенные значения. Возьмите следующий пример:
(function(angular) {
var module = angular.module('stackoverflow.example',[]);
module.controller('simpleController', function($scope, $document) {
this.getOrigin = function() {
return $document[0].location.origin;
};
});
module.controller('complexController', function($scope, $controller) {
angular.extend(this, $controller('simpleController', {$scope: $scope}));
});
})(angular);
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular.js"></script>
<div ng-app="stackoverflow.example">
<div ng-controller="complexController as C">
<span><b>Origin from Controller:</b> {{C.getOrigin()}}</span>
</div>
</div>
Хотя $ document не передается в 'simpleController', когда он создается 'complexController', $ document вводится для нас.
$.extend()
, вы можете просто позвонить$controller('CtrlImpl', {$scope: $scope});
angular.extend
(или$.extend
) на самом деле означает расширение$scope
only, но если ваш базовый контроллер также определяет некоторые свойства (напримерthis.myVar=5
), у вас есть доступ только кthis.myVar
расширяющему контроллеру при использованииangular.extend
handleSubmitClick
который будет вызывать,handleLogin
который в свою очередь имеетloginSuccess
иloginFail
. Таким образом, в моем расширенном контроллере я тогда должен был перегрузитьhandleSubmitClick
,handleLogin
иloginSucess
для правильнойloginSuccess
функции , которая будет использоваться.Для наследования вы можете использовать стандартные шаблоны наследования JavaScript. Вот демо, которое использует
$injector
В случае, если вы используете
controllerAs
синтаксис (который я настоятельно рекомендую), еще проще использовать классический шаблон наследования:Другим способом может быть создание просто «абстрактной» функции конструктора, которая будет вашим базовым контроллером:
Сообщение в блоге на эту тему
источник
Ну, я не совсем уверен, чего вы хотите достичь, но обычно услуги - это путь. Вы также можете использовать характеристики наследования Scope Angular для совместного использования кода между контроллерами:
источник
$scope.$parent.fx( )
будет ли намного более чистый способ сделать это, так как именно здесь это определено?Вы не расширяете контроллеры. Если они выполняют те же основные функции, то эти функции необходимо перенести в службу. Эта услуга может быть введена в ваши контроллеры.
источник
Еще одно хорошее решение, взятое из этой статьи :
источник
Вы можете создать сервис и наследовать его поведение в любом контроллере, просто внедрив его.
Затем в вашем контроллере, который вы хотите расширить из вышеупомянутого сервиса reusableCode:
ДЕМО ПЛАНКЕР: http://plnkr.co/edit/EQtj6I0X08xprE8D0n5b?p=preview
источник
Вы можете попробовать что-то вроде этого (не проверял):
источник
Вы можете расширить с помощью услуг , заводов или поставщиков . они одинаковы, но с разной степенью гибкости.
Вот пример использования фабрики: http://jsfiddle.net/aaaflyvw/6KVtj/2/
И здесь вы можете использовать функцию магазина также:
источник
Вы можете напрямую использовать $ controller ('ParentController', {$ scope: $ scope}). Пример
источник
Вы можете использовать Angular «как» синтаксис в сочетании с простым наследованием JavaScript
Подробности смотрите здесь http://blogs.microsoft.co.il/oric/2015/01/01/base-controller-angularjs/
источник
Я написал функцию для этого:
Вы можете использовать это так:
Плюсы:
Минусы:
источник
Я считаю расширение контроллеров плохой практикой. Скорее поместите свою общую логику в сервис. Расширенные объекты в JavaScript, как правило, становятся довольно сложными. Если вы хотите использовать наследование, я бы порекомендовал машинопись. Тем не менее, тонкие контроллеры - лучший способ пойти по моему мнению.
источник