web-dev-qa-db-ja.com

Angular JS $ watch vs $ on

親スコープで状態が変化するたびに、ディレクティブ内で関数を実行したい。

これを実現する明白な方法は、イベントブロードキャスト( $ broadcast )とリスナー(- $ on )を使用することです。

$ watchを使用することがイベントブロードキャストに代わるものであるかどうか興味があります。もしそうなら、2つはどう比較されますか?

私の知る限り、監視対象の式は$ digestサイクルごとに評価されます。では、イベントは監視よりも効率的ですか?

34
Yogesh Mangaj

$watch関数は、スコープ上の変数を監視するために使用されます。スコープの継承により、親のスコープ変数も監視することができるため、これが間違いなくユースケースに適しています。あなたが正しく言ったように、$onはイベントを監視するために使用され、_$broadcastから子スコープまたは$emitを親スコープに。これにより、より多くの制御が可能になりますが、監視しておらずリスナーに通知するのを忘れた時点からスコープ変数の更新を取得できるため、コーディング中により多くのミスを引き起こす可能性があります。

スコープ変数を継承しない場合でも、引き続きイベントを使用できます。ただし、大規模なスコープを汚染しないように注意してください。サービスを使用することはオプションである可能性があります。

ディレクティブは有効範囲を取得する(または継承する)ので、$watchは、ここでははるかにクリーンなオプションです。

ディレクティブに分離されたスコープを持たせたい場合は、引数を属性として渡し、$observeそれら。

32