Si votre intention est de vous procurer un contrôleur déjà instancié d'un autre composant et que si vous suivez une approche basée sur un composant / une directive, vous pouvez toujours require
un contrôleur (instance d'un composant) d'un autre composant qui suit une certaine hiérarchie.
Par exemple:
//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.
},
...
});
Maintenant, l'utilisation de ces composants ci-dessus pourrait être quelque chose comme ceci:
<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>
Il existe de nombreuses façons de configurer require .
(pas de préfixe) - Localisez le contrôleur requis sur l'élément actuel. Lancer une erreur si non trouvée.
? - Essayez de localiser le contrôleur requis ou passez null au lien fn s'il n'est pas trouvé.
^ - Localisez le contrôleur requis en recherchant l'élément et ses parents. Lancer une erreur si non trouvée.
^^ - Localisez le contrôleur requis en recherchant les parents de l'élément. Lancer une erreur si non trouvée.
? ^ - Essayez de localiser le contrôleur requis en recherchant l'élément et ses parents ou passez null au lien fn s'il n'est pas trouvé.
? ^^ - Essayez de localiser le contrôleur requis en recherchant les parents de l'élément, ou passez null au lien fn s'il n'est pas trouvé.
Ancienne réponse:
Vous devez injecter un $controller
service pour instancier un contrôleur dans un autre contrôleur. Mais sachez que cela peut entraîner des problèmes de conception. Vous pouvez toujours créer des services réutilisables qui suivent une responsabilité unique et les injecter dans les contrôleurs selon vos besoins.
Exemple:
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.
}]);
Dans tous les cas, vous ne pouvez pas appeler TestCtrl1.myMethod()
car vous avez attaché la méthode sur $scope
et non sur l'instance de contrôleur.
Si vous partagez le contrôleur, il serait toujours préférable de faire: -
.controller('TestCtrl1', ['$log', function ($log) {
this.myMethod = function () {
$log.debug("TestCtrl1 - myMethod");
}
}]);
et en consommant faire:
.controller('TestCtrl2', ['$scope', '$controller', function ($scope, $controller) {
var testCtrl1ViewModel = $controller('TestCtrl1');
testCtrl1ViewModel.myMethod();
}]);
Dans le premier cas, c'est vraiment $scope
votre modèle de vue, et dans le second cas, c'est l'instance de contrôleur elle-même.
TestCtrl1
plutôt vous transformer en service.