Zarejestruj funkcję dziecka na rodzica, gdy dziecko jest inicjalizacji. Użyłem "notacji" jako jasności w szablonie.
WZÓR
<div ng-controller="ParentCntl as p">
<div ng-controller="ChildCntl as c" ng-init="p.init(c.get)"></div>
</div>
STEROWNIKI
...
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";
};
}
"Ale", można powiedzieć, "ng-init
isn't supposed to be used this way!". No tak, ale
- że dokumentacja nie wyjaśnia, dlaczego nie, i
- Nie wierzę, autorzy dokumentacji rozważeniu wszystkich możliwych przypadków użycia dla niego.
Mówię, że to dobry użytek. Jeśli chcesz mnie zlekceważyć, skomentuj powody! :)
Podoba mi się to podejście, ponieważ utrzymuje elementy bardziej modułowe. Jedyne powiązania są w szablonie, a to oznacza, że
- dziecko Kontroler nie musi nic wiedzieć o który obiekt, aby dodać swoją funkcję (jak w odpowiedzi @ canttouchit za)
- kontrola rodzic może być używany z dowolnym innym child Control, który posiada funkcję get
- nie wymaga transmisji, która będzie bardzo brzydki w wielkim aplikacji, chyba że ściśle kontrolować nazw zdarzeń
Takie podejście bliżej podejść Tero's idea of modularising with directives (uwaga w jego modularis ed example, contestants
jest przekazywana z nadrzędnej do dyrektywy "potomnej" W SZABLONIE).
Rzeczywiście innym rozwiązaniem może być rozważenie wdrożenia ChildCntl
jako dyrektywy i użycie wiązania &
do zarejestrowania metody init
.
Najlepszy zakład, zdefiniuj usługę, wprowadź tę usługę do obu kontrolerów. Lub użyj rootcope. – tymeJV