AngularJS1で、独自に定義したディレクティブで作成するテンプレート内のなんかの要素をクリックされた時にその要素を使ってなんかしたいといった時に、試行錯誤してやっとできたのでメモ。そもそもディレクティブやスコープをよく理解してないのでアレだけど…
クリックした時の処理をng-clickで指定する場合
例えば独自のディレクティブfoo
で、クリックされた時の処理をng-click
で指定するとして
<foo ng-click="onClick(ev)">Click me 1</foo> |
それをハンドルするためには、以下のようになった:
// app.js |
directive
のscope
でngClick
を&
指定して、親スコープでのものにする(?)template
で、foo
タグで展開する内容の中の例えばa
タグのng-click
に設定する際に、その中で呼び出すngClick
への引数にはオブジェクトでパラメータ名を指定して渡す({ev: $event}
)- この場合、htmlの
foo
タグのng-click
内で使用する変数ev
に、a
タグがクリックされた時のイベント情報$event
を割り当てることになる(?) ev
を$event
という名前に変えれば、htmlのng-click
内でも通常と同じように$event
がイベント情報として使える、がここでは区別しやすくするため別名とした
- この場合、htmlの
ng-click
の内容はa
タグに移すので、directive
のlink
関数内でelement
(実体はfoo
タグ)からng-click
を削除- 削除してもクリックハンドラは設定されてしまっているようなので、
element.off('click')
でハンドラを解除
以上で、a
タグがクリックされた時にスコープのonClick
が呼び出されて、そのパラメータ$event
にはng-click
のイベント$event
が渡ってきて、そのcurrentTarget
でa
タグが取得できる
暗黙的に呼び出す関数を指定する場合
ディレクティブで暗黙的に呼び出す関数を指定する場合、例えば
<bar>Click me 2</bar> |
などとしたときにクリックされたら自動的にonClick
関数を呼び出すとする場合、以下のようにする:
// app.js |
- この場合、展開される場所のスコープがそのまま使えるので、
onClick($event)
でそのまま呼び出せる