Регистрация функции ребенка на родителей, когда ребенок инициализируется. Я использовал «как» обозначение для ясности в шаблоне.
ШАБЛОН
<div ng-controller="ParentCntl as p">
<div ng-controller="ChildCntl as c" ng-init="p.init(c.get)"></div>
</div>
КОНТРОЛЛЕРЫ
...
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";
};
}
"Но", вы говорите, "ng-init
isn't supposed to be used this way!". Ну, да, но
- , что документация не объясняет, почему нет, и
- Я не верю, что авторы документации рассмотрены все возможные варианты использования для него.
Я говорю, что это хорошо для этого. Если вы хотите сфокусировать меня, прокомментируйте причины! :)
Мне нравится этот подход, потому что он сохраняет компоненты более модульными. Единственные привязки в шаблоне, и означает, что
- ребенка контроллер не должен ничего знать о том, какой именно объект, чтобы добавить свою функцию (как в ответ @ canttouchit в)
- родительский контроль может быть использовать с любым другим дочернего элемента управления, который имеет функцию ПОЛУЧИТЬ
- не требует вещания, который получит очень некрасиво в большом приложении, если вы плотно не контролировать пространство имен событий
Этот подход более близко подходит Tero's idea of modularising with directives (примечание что в его модуле ed, contestants
передается от родительской к «дочерней» директиве В ШАБЛОНЕ).
Действительно, другим решением может быть рассмотреть вопрос об использовании ChildCntl
в качестве директивы и использовать привязку &
для регистрации метода init
.
Лучшая ставка, определить услугу, ввести эту услугу в оба контроллера. Или используйте корнеплод. – tymeJV