子供の初期化時に、子供の機能を親に登録します。テンプレートを明確にするために、「as」表記を使用しました。
テンプレート
<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
この方法で使用することは想定されていません!」。ええ、そうですが
- そのドキュメントはなぜそうでないのかを説明していない、そして
- ドキュメント作成者が考えられるすべてのユースケースを検討したとは思いません。
これは良い使い方だと思います。私に反対票を投じる場合は、理由をコメントしてください!:)
コンポーネントをよりモジュール化するため、このアプローチが気に入っています。唯一のバインディングはテンプレートにあり、それは
- 子コントローラーは、その機能を追加するオブジェクトについて何も知る必要はありません(@canttouchitの回答のように)
- 親コントロールは、get関数を持つ他の子コントロールと一緒に使用できます
- ブロードキャストは必要ありません。イベントの名前空間を厳密に制御しない限り、大きなアプリでは非常に醜くなります。
このアプローチは、ディレクティブでモジュール化するというTeroのアイデアにさらに近づきます(彼のモジュール化された例でcontestants
は、親から「子」ディレクティブにテンプレートが渡されることに注意してください)。
実際、別の解決策はChildCntl
、をディレクティブとして実装することを検討し、&
バインディングを使用してinit
メソッドを登録することです。