Mam trzy kontrolery, które są dość podobne. Chcę mieć kontroler, który te trzy rozszerzenia rozszerzają i dzielą jego funkcje.
źródło
Mam trzy kontrolery, które są dość podobne. Chcę mieć kontroler, który te trzy rozszerzenia rozszerzają i dzielą jego funkcje.
Może ty nie rozciągają kontroler ale możliwe jest rozszerzenie kontrolera lub dokonać jednego kontrolera wstawką wielu kontrolerów.
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.
}]);
Po utworzeniu kontrolera nadrzędnego zawarta w nim logika jest również wykonywana. Aby uzyskać więcej informacji, zobacz $ controller (), ale tylko $scope
wartość musi zostać przekazana. Wszystkie pozostałe wartości zostaną wstrzyknięte normalnie.
@mwarren , twoje obawy są rozwiązywane automatycznie przez wstrzyknięcie zależności kątowej . Wszystko, czego potrzebujesz, to wstrzyknięcie $ scope, chociaż w razie potrzeby możesz zastąpić inne wstrzyknięte wartości. Weź następujący przykład:
(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>
Chociaż dokument $ nie jest przekazywany do „simpleController”, gdy jest tworzony przez „complexController”, dokument $ jest dla nas wstrzykiwany.
$.extend()
, możesz po prostu zadzwonić$controller('CtrlImpl', {$scope: $scope});
angular.extend
(lub$.extend
) w rzeczywistości oznacza rozszerzenie$scope
jedynego, ale jeśli kontroler podstawowy również definiuje niektóre właściwości (np.this.myVar=5
), masz dostęp tylko dothis.myVar
kontrolera rozszerzającego podczas używaniaangular.extend
handleSubmitClick
który zadzwoniłby,handleLogin
który z kolei miałbyloginSuccess
aloginFail
. Tak więc, moim rozszerzonego kontrolera Ja wtedy miałem do przeciążeniahandleSubmitClick
,handleLogin
orazloginSucess
dla prawidłowegologinSuccess
funkcjonowania ma być używany.Do dziedziczenia można użyć standardowych wzorców dziedziczenia JavaScript. Oto demo, które wykorzystuje
$injector
Jeśli używasz
controllerAs
składni (którą bardzo polecam), jeszcze łatwiej jest użyć klasycznego wzorca dziedziczenia:Innym sposobem może być stworzenie po prostu „abstrakcyjnej” funkcji konstruktora, która będzie twoim podstawowym kontrolerem:
Wpis na blogu na ten temat
źródło
Cóż, nie jestem do końca pewien, co chcesz osiągnąć, ale zazwyczaj usługi są właściwą drogą. Możesz także użyć charakterystyki dziedziczenia Scope Angulara, aby współdzielić kod między kontrolerami:
źródło
$scope.$parent.fx( )
byłby o wiele czystszym sposobem na zrobienie tego, skoro tak naprawdę jest to zdefiniowane?Nie rozbudowujesz kontrolerów. Jeśli wykonują te same podstawowe funkcje, funkcje te należy przenieść do usługi. Tę usługę można wprowadzić do kontrolerów.
źródło
Kolejne dobre rozwiązanie zaczerpnięte z tego artykułu :
źródło
Możesz utworzyć usługę i odziedziczyć jej zachowanie w dowolnym kontrolerze, po prostu wstrzykując ją.
Następnie w kontrolerze, który chcesz rozszerzyć z powyższej usługi kodu wielokrotnego użytku:
DEMO PLUNKER: http://plnkr.co/edit/EQtj6I0X08xprE8D0n5b?p=preview
źródło
Możesz spróbować czegoś takiego (nie testowałem):
źródło
Możesz rozszerzyć o usługi , fabryki lub dostawców . są takie same, ale o różnym stopniu elastyczności.
tutaj przykład przy użyciu fabryki: http://jsfiddle.net/aaaflyvw/6KVtj/2/
I tutaj możesz również użyć funkcji sklepu:
źródło
Możesz bezpośrednio użyć kontrolera $ („ParentController”, {$ scope: $ scope}) Przykład
źródło
Możesz użyć składni Angular „as” w połączeniu ze zwykłym dziedziczeniem JavaScript
Zobacz więcej szczegółów tutaj http://blogs.microsoft.co.il/oric/2015/01/01/base-controller-angularjs/
źródło
Napisałem funkcję, aby to zrobić:
Możesz użyć tego w następujący sposób:
Plusy:
Cons:
źródło
Rozważanie rozszerzenia kontrolerów uważam za złą praktykę. Zamiast tego umieść wspólną logikę w usłudze. Rozszerzone obiekty w javascript stają się raczej skomplikowane. Jeśli chcesz użyć dziedziczenia, polecam maszynopis. Mimo to cienkie kontrolery są moim zdaniem lepszym sposobem.
źródło