Registre la función del niño en el padre cuando el niño se está inicializando. Usé la notación "como" para mayor claridad en la plantilla.
MODELO
<div ng-controller="ParentCntl as p">
<div ng-controller="ChildCntl as c" ng-init="p.init(c.get)"></div>
</div>
CONTROLADORES
...
function ParentCntl() {
var p = this;
p.init = function(fnToRegister) {
p.childGet = fnToRegister;
};
// call p.childGet when you want
}
function ChildCntl() {
var c = this;
c.get = function() {
return "LOL";
};
}
"Pero", dices, "¡ ng-init
no se supone que se use de esta manera !". Bueno si pero
- que la documentación no explica por qué no, y
- No creo que los autores de la documentación hayan considerado TODOS los posibles casos de uso.
Digo que este es un buen uso para él. Si quieres rechazarme, ¡comenta con las razones! :)
Me gusta este enfoque porque mantiene los componentes más modulares. Los únicos enlaces están en la plantilla y significa que
- el controlador secundario no tiene que saber nada sobre a qué objeto agregar su función (como en la respuesta de @ canttouchit)
- el control principal se puede usar con cualquier otro control secundario que tenga una función de obtención
- no requiere transmisión, lo que se pondrá muy feo en una gran aplicación a menos que controle estrictamente el espacio de nombres del evento
Este enfoque se acerca más a la idea de Tero de modularizar con directivas (nótese que en su ejemplo modularizado, contestants
se pasa de directiva padre a "hijo" EN LA PLANTILLA).
De hecho, otra solución podría ser considerar implementar el ChildCntl
como una directiva y usar el &
enlace para registrar el init
método.