Ich habe drei Controller, die ziemlich ähnlich sind. Ich möchte einen Controller haben, den diese drei erweitern und seine Funktionen teilen.
quelle
Ich habe drei Controller, die ziemlich ähnlich sind. Ich möchte einen Controller haben, den diese drei erweitern und seine Funktionen teilen.
Vielleicht erweitern Sie einen Controller nicht, aber es ist möglich, einen Controller zu erweitern oder einen einzelnen Controller zu einer Mischung aus mehreren Controllern zu machen.
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.
}]);
Wenn der übergeordnete Controller erstellt wird, wird auch die darin enthaltene Logik ausgeführt. Weitere Informationen zu $ controller () finden Sie unter, aber nur der $scope
Wert muss übergeben werden. Alle anderen Werte werden normal injiziert.
@mwarren , Ihr Anliegen wird automatisch durch Angular Dependency Injection beseitigt . Alles, was Sie brauchen, ist $ scope zu injizieren, obwohl Sie die anderen injizierten Werte bei Bedarf überschreiben können. Nehmen Sie das folgende Beispiel:
(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>
Obwohl $ document nicht an 'simpleController' übergeben wird, wenn es von 'complexController' erstellt wird, wird $ document für uns injiziert.
$.extend()
, du kannst einfach anrufen$controller('CtrlImpl', {$scope: $scope});
angular.extend
(oder$.extend
) bedeutet eigentlich das Erweitern des$scope
einzigen, aber wenn Ihr Basis-Controller auch einige Eigenschaften definiert (z. B.this.myVar=5
), haben Sie nur Zugriff aufthis.myVar
den erweiterten Controller, wenn Sieangular.extend
handleSubmitClick
welche würde anrufen,handleLogin
welche wiederum einloginSuccess
und hattenloginFail
. Also, in meinem erweiterten Controller ich dann musste die zu überlastenhandleSubmitClick
,handleLogin
undloginSucess
für die korrekteloginSuccess
Funktion zu nutzen.Für die Vererbung können Sie Standard-JavaScript-Vererbungsmuster verwenden. Hier ist eine Demo, die verwendet
$injector
Wenn Sie die
controllerAs
Syntax verwenden (die ich sehr empfehle), ist es noch einfacher, das klassische Vererbungsmuster zu verwenden:Eine andere Möglichkeit könnte darin bestehen, nur eine "abstrakte" Konstruktorfunktion zu erstellen, die Ihr Basis-Controller sein wird:
Blogbeitrag zu diesem Thema
quelle
Nun, ich bin mir nicht ganz sicher, was Sie erreichen möchten, aber normalerweise sind Services der richtige Weg. Sie können auch die Scope-Vererbungseigenschaften von Angular verwenden, um Code zwischen Controllern freizugeben:
quelle
$scope.$parent.fx( )
viel sauberer, da es dort tatsächlich definiert ist?Sie erweitern keine Controller. Wenn sie dieselben Grundfunktionen ausführen, müssen diese Funktionen in einen Dienst verschoben werden. Dieser Dienst kann in Ihre Controller eingespeist werden.
quelle
Noch eine gute Lösung aus diesem Artikel :
quelle
Sie können einen Dienst erstellen und sein Verhalten in jedem Controller erben, indem Sie ihn einfach einfügen.
Dann in Ihrem Controller, den Sie vom oben genannten reusableCode-Dienst erweitern möchten:
DEMO PLUNKER: http://plnkr.co/edit/EQtj6I0X08xprE8D0n5b?p=preview
quelle
Sie können so etwas ausprobieren (noch nicht getestet):
quelle
Sie können mit einem Service , Fabriken oder Anbietern erweitern . Sie sind gleich, aber unterschiedlich flexibel.
Hier ein Beispiel mit Factory: http://jsfiddle.net/aaaflyvw/6KVtj/2/
Und hier können Sie auch die Store-Funktion nutzen:
quelle
Sie können das Beispiel $ controller ('ParentController', {$ scope: $ scope}) direkt verwenden
quelle
Sie können die Angular-Syntax "as" in Kombination mit einer einfachen JavaScript-Vererbung verwenden
Weitere Details finden Sie hier http://blogs.microsoft.co.il/oric/2015/01/01/base-controller-angularjs/
quelle
Ich habe eine Funktion geschrieben, um dies zu tun:
Sie können es so verwenden:
Vorteile:
Nachteile:
quelle
Ich betrachte die Erweiterung von Controllern als schlechte Praxis. Stellen Sie Ihre gemeinsame Logik lieber in einen Dienst. Erweiterte Objekte in Javascript werden in der Regel recht komplex. Wenn Sie die Vererbung verwenden möchten, würde ich Typoskript empfehlen. Trotzdem sind Thin Controller aus meiner Sicht der bessere Weg.
quelle