Registro Funzione del bambino sul genitore quando il bambino è in fase di inizializzazione. Ho usato la notazione "as" per chiarezza nel template.
MODELLO
<div ng-controller="ParentCntl as p">
<div ng-controller="ChildCntl as c" ng-init="p.init(c.get)"></div>
</div>
CONTROLLORI
...
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";
};
}
"Ma", si dicono: "ng-init
isn't supposed to be used this way!". Beh, sì, ma
- che la documentazione non spiega perché no, e
- non credo di documentazione degli autori considerati tutti i possibili casi di utilizzo per esso.
Dico questo è un buon uso per questo. Se vuoi farmi una votazione, per favore commenta con le ragioni! :)
Mi piace questo approccio perché mantiene i componenti più modulari. Gli unici attacchi sono nel modello, e significa che
- il bambino controller non deve sapere nulla di quale oggetto per aggiungere la funzione in (come nella risposta di @ canttouchit)
- controllo padre può essere utilizzato con qualsiasi altro controllo figlio che ha una funzione get
- non necessita di radiodiffusione, che otterrà molto brutto in una grande applicazione a meno che non si controlla strettamente lo spazio dei nomi evento
Questo approccio si avvicina di più a stretto contatto Tero's idea of modularising with directives (nota quello nella sua modularis ed esempio, contestants
viene passato dalla direttiva madre alla direttiva "figlio" NEL MODELLO).
In effetti un'altra soluzione potrebbe essere considerare l'implementazione di ChildCntl
come una direttiva e utilizzare il binding &
per registrare il metodo init
.
La migliore scommessa, definire un servizio, iniettare quel servizio in entrambi i controller. O usare il rootscope. – tymeJV