Innerhalb eines Moduls kann ein Controller Eigenschaften von einem externen Controller erben:
var app = angular.module('angularjs-starter', []);
var ParentCtrl = function ($scope, $location) {
};
app.controller('ChildCtrl', function($scope, $injector) {
$injector.invoke(ParentCtrl, this, {$scope: $scope});
});
Beispiel über: Dead Link : http://blog.omkarpatil.com/2013/02/controller-inheritance-in-angularjs.html
Kann auch ein Controller in einem Modul von einem Geschwister erben?
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
});
Der zweite Code funktioniert nicht, da $injector.invoke
eine Funktion als erster Parameter erforderlich ist und der Verweis auf nicht gefunden wird ParentCtrl
.
angularjs
inheritance
angularjs-controller
Federico Elles
quelle
quelle
Antworten:
Ja, es kann, aber Sie müssen
$controller
stattdessen den Dienst verwenden, um den Controller zu instanziieren: -quelle
ParentCtrl
sollte ein seincontroller
oder ist es möglich ein zu verwendenservice
?$controller
nur registrierte Controller verwendet werden können.$scope
zuthis
(in der Theorie)Wenn Sie die
vm
Controller-Syntax verwenden , ist hier meine Lösung:Leider können Sie nicht verwenden
$controller.call(vm, 'BaseGenericCtrl'...)
, um den aktuellen Kontext an die Closure (forreload()
) -Funktion zu übergeben. Daher besteht nur eine Lösung darin,this
innerhalb der geerbten Funktion zu verwenden, um den Kontext dynamisch zu ändern.quelle
vm
ist nur eine Variable innerhalb des Controllers, ich glaube nicht, dass Angular sie wie erwartet verwenden könnte.Ich denke, Sie sollten die Fabrik oder den Service verwenden, um zugängliche Funktionen oder Daten für beide Controller bereitzustellen.
Hier ist eine ähnliche Frage ---> AngularJS-Controller-Vererbung
quelle
loading
Variable, damit ich beim Laden von Daten immer das Gleiche mache. Ich glaube nicht, dass Fabriken das können. Mein übergeordneter Controller kann eine Ladevariable haben, aber die Fabrik kann sie nicht manipulieren ... richtig?!Als Antwort auf das in dieser Antwort von gmontague angesprochene Problem habe ich eine Methode gefunden, um einen Controller mit $ controller () zu erben und den Controller weiterhin als Syntax "as" zu verwenden.
Verwenden Sie zunächst die Syntax "as", wenn Sie den Aufruf von $ controller () erben:
Wenn die Eigenschaft in einer HTML-Vorlage vom übergeordneten Element definiert wird, verwenden Sie
parent.
diese Option, um vom übergeordneten Element geerbte Eigenschaften abzurufen. Wenn vom Kind definiert, verwenden Sie eschild.
, um es abzurufen.quelle
Nun, ich habe das anders gemacht. In meinem Fall wollte ich eine Funktion, die dieselben Funktionen und Eigenschaften in anderen Controllern anwendet. Mir hat es gefallen, außer nach Parametern. Auf diese Weise müssen alle Ihre ChildCtrls $ location erhalten.
quelle
Wenn Sie sich fragen, können Sie Komponenten-Controller auf dieselbe Weise erweitern, indem Sie die Methode in der akzeptierten Antwort verwenden.
Verwenden Sie den folgenden Ansatz:
Übergeordnete Komponente (zu erweitern von):
Untergeordnete Komponente (die erweiterte):
Der Trick besteht darin, benannte Controller zu verwenden, anstatt sie in der Komponentendefinition zu definieren.
quelle
Wie in der akzeptierten Antwort erwähnt, können Sie die Änderungen eines übergeordneten Controllers an $ scope und anderen Diensten "erben", indem Sie Folgendes aufrufen:
$controller('ParentCtrl', {$scope: $scope, etc: etc});
in Ihrem untergeordneten Controller.Dies schlägt jedoch fehl, wenn Sie es gewohnt sind, die Controller-Syntax 'as' zu verwenden, z. B. in
Wenn dies
foo
im übergeordneten Controller (viathis.foo = ...
) festgelegt wurde, hat der untergeordnete Controller keinen Zugriff darauf.Wie in den Kommentaren erwähnt, können Sie das Ergebnis von $ controller direkt dem Bereich zuordnen:
Hinweis: Sie müssen dann den Teil 'as' aus entfernen
ng-controller=
, da Sie den Instanznamen im Code und nicht mehr die Vorlage angeben.quelle
Ich habe die Syntax "Controller as" mit verwendet
vm = this
und wollte einen Controller erben. Ich hatte Probleme, wenn mein übergeordneter Controller eine Funktion hatte, die eine Variable änderte.Mit den Antworten von IProblemFactory und Salman Abbas habe ich Folgendes getan, um Zugriff auf übergeordnete Variablen zu erhalten:
quelle
Sie können einen einfachen JavaScript-Vererbungsmechanismus verwenden. Vergessen Sie auch nicht, einen erforderlichen Winkeldienst zu übergeben, um die .call-Methode aufzurufen.
quelle
Unter dem unten angegebenen Link finden Sie Informationen zu AngularJs Vererbungen.
Controller-Inheritance-in-Angularjs
quelle