AngularJS1.5でコンポーネントの中にコンポーネントを配置した場合の、その親子間でやりとりする方法を調べた。
デモ:http://plnkr.co/edit/6OtbJKlX121gkwEVJJsj?p=preview
親から子に値を渡す
バインディングで引き渡す:
// Parent component |
- 親コンポーネントから子コンポーネントにアトリビュートとして、
names="parent.names"
などとバインディングでデータを渡す - 子コンポーネントで
bindings: {names: '='}
としてコントローラにバインドする - あとはコントローラのプロパティとして使えるので、なんなりと好きなように、
ng-repeat
で回したり
子から親に通知
子コンポーネント側でなにか起きた時に、親側で処理させるために親コンポーネントに通知したい
// Parent component |
- 子コンポーネント側で、
bindings: {onChildFired: '&'}
などとして、ハンドラを受け取れるようにする - 子コンポーネント側から親に通知する場合、子のコントローラ内で
this.onChildFired(...)
として、関数を呼び出してやる- 引数はオブジェクトで
{'$name': name}
などとして、ハンドラ内で参照する名前:値
で渡す
- 引数はオブジェクトで
- 親コンポーネントからは
on-child-fired="parent.onClickButton($name)"
などと受け取って処理する
親から子に通知
親から値をバインディングとして子に渡すだけならいいが、なにか変更があったときに処理を呼び出したい、といった場合に簡単なやり方がわからなかった…。
AngularJS: Developer Guide: Componentsの「Intercomponent Communication」のように、子コンポーネント側でrequire: '^parent'
として$onInit
で親に自分を受け渡しておく、ということになるんだろうか。
(Angular2では親コンポーネントから@ViewChild
とか@ContentChild
とかで子コンポーネントを取れるので、簡単に呼び出せる)