Wenn Sie beabsichtigen, einen bereits instanziierten Controller einer anderen Komponente zu erhalten, und wenn Sie einen komponenten- / richtlinienbasierten Ansatz verfolgen, können Sie immer require
einen Controller (eine Instanz einer Komponente) von einer anderen Komponente aus verwenden, die einer bestimmten Hierarchie folgt.
Beispielsweise:
//some container component that provides a wizard and transcludes the page components displayed in a wizard
myModule.component('wizardContainer', {
...,
controller : function WizardController() {
this.disableNext = function() {
//disable next step... some implementation to disable the next button hosted by the wizard
}
},
...
});
//some child component
myModule.component('onboardingStep', {
...,
controller : function OnboadingStepController(){
this.$onInit = function() {
//.... you can access this.container.disableNext() function
}
this.onChange = function(val) {
//..say some value has been changed and it is not valid i do not want wizard to enable next button so i call container's disable method i.e
if(notIsValid(val)){
this.container.disableNext();
}
}
},
...,
require : {
container: '^^wizardContainer' //Require a wizard component's controller which exist in its parent hierarchy.
},
...
});
Die Verwendung dieser oben genannten Komponenten könnte nun ungefähr so aussehen:
<wizard-container ....>
<!--some stuff-->
...
<!-- some where there is this page that displays initial step via child component -->
<on-boarding-step ...>
<!--- some stuff-->
</on-boarding-step>
...
<!--some stuff-->
</wizard-container>
Es gibt viele Möglichkeiten , wie Sie festlegen können bis erfordern .
(kein Präfix) - Suchen Sie den erforderlichen Controller auf dem aktuellen Element. Wirf einen Fehler, wenn er nicht gefunden wird.
? - Versuchen Sie, den erforderlichen Controller zu finden, oder übergeben Sie null an den Link fn, wenn er nicht gefunden wird.
^ - Suchen Sie den gewünschten Controller, indem Sie das Element und seine übergeordneten Elemente durchsuchen. Wirf einen Fehler, wenn er nicht gefunden wird.
^^ - Suchen Sie den gewünschten Controller, indem Sie die Eltern des Elements durchsuchen. Wirf einen Fehler, wenn er nicht gefunden wird.
? ^ - Versuchen Sie, den erforderlichen Controller zu finden, indem Sie das Element und seine übergeordneten Elemente durchsuchen, oder übergeben Sie null an den Link fn, wenn er nicht gefunden wird.
? ^^ - Versuchen Sie, den erforderlichen Controller zu finden, indem Sie die übergeordneten Elemente des Elements durchsuchen, oder übergeben Sie null an den Link fn, wenn er nicht gefunden wird.
Alte Antwort:
Sie müssen einen $controller
Dienst einspeisen, um einen Controller in einem anderen Controller zu instanziieren. Beachten Sie jedoch, dass dies zu einigen Designproblemen führen kann. Sie können jederzeit wiederverwendbare Services erstellen, die der Einzelverantwortung folgen, und diese nach Bedarf in die Controller einfügen.
Beispiel:
app.controller('TestCtrl2', ['$scope', '$controller', function ($scope, $controller) {
var testCtrl1ViewModel = $scope.$new(); //You need to supply a scope while instantiating.
//Provide the scope, you can also do $scope.$new(true) in order to create an isolated scope.
//In this case it is the child scope of this scope.
$controller('TestCtrl1',{$scope : testCtrl1ViewModel });
testCtrl1ViewModel.myMethod(); //And call the method on the newScope.
}]);
In jedem Fall können Sie nicht aufrufen, TestCtrl1.myMethod()
da Sie die Methode an die $scope
und nicht an die Controller-Instanz angehängt haben .
Wenn Sie den Controller gemeinsam nutzen, ist es immer besser, Folgendes zu tun:
.controller('TestCtrl1', ['$log', function ($log) {
this.myMethod = function () {
$log.debug("TestCtrl1 - myMethod");
}
}]);
und während des Konsums tun:
.controller('TestCtrl2', ['$scope', '$controller', function ($scope, $controller) {
var testCtrl1ViewModel = $controller('TestCtrl1');
testCtrl1ViewModel.myMethod();
}]);
Im ersten Fall ist das wirklich $scope
Ihr Ansichtsmodell und im zweiten Fall die Controller-Instanz selbst.
TestCtrl1
stattdessen in einen Dienst wechseln .