Si su intención es obtener un controlador ya instanciado de otro componente y si está siguiendo un enfoque basado en componentes / directivas, siempre puede obtener require
un controlador (instancia de un componente) de otro componente que sigue una determinada jerarquía.
Por ejemplo:
//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.
},
...
});
Ahora, el uso de estos componentes anteriores podría ser algo como esto:
<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>
Hay muchas formas de configurar require .
(sin prefijo): localice el controlador requerido en el elemento actual. Lanza un error si no se encuentra.
? - Intente ubicar el controlador requerido o pase nulo al enlace fn si no lo encuentra.
^ - Localice el controlador requerido buscando el elemento y sus padres. Lanza un error si no se encuentra.
^^ - Localice el controlador requerido buscando los padres del elemento. Lanza un error si no se encuentra.
? ^ - Intente ubicar el controlador requerido buscando el elemento y sus padres o pase nulo al enlace fn si no lo encuentra.
? ^^ - Intente ubicar el controlador requerido buscando en los padres del elemento, o pase nulo al enlace fn si no lo encuentra.
Respuesta anterior:
Debe inyectar el $controller
servicio para crear una instancia de un controlador dentro de otro controlador. Pero tenga en cuenta que esto puede provocar algunos problemas de diseño. Siempre puede crear servicios reutilizables que sigan la responsabilidad única e inyectarlos en los controladores según lo necesite.
Ejemplo:
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.
}]);
En cualquier caso, no puede llamar TestCtrl1.myMethod()
porque ha adjuntado el método en la $scope
instancia del controlador y no en la.
Si está compartiendo el controlador, siempre será mejor hacer: -
.controller('TestCtrl1', ['$log', function ($log) {
this.myMethod = function () {
$log.debug("TestCtrl1 - myMethod");
}
}]);
y mientras consumes:
.controller('TestCtrl2', ['$scope', '$controller', function ($scope, $controller) {
var testCtrl1ViewModel = $controller('TestCtrl1');
testCtrl1ViewModel.myMethod();
}]);
En el primer caso, realmente $scope
es su modelo de vista, y en el segundo caso es la instancia del controlador en sí.
TestCtrl1
a un servicio.