8

特に、ディレクティブを使用しているモジュールでコールバックを呼び出す場合は、angularjsのスコープの周りを頭で囲んでいます。私は同じことを達成するための3つの異なる方法を見つけました。そして、それぞれのアプローチに賛否両論を理解しようとしています。ディレクティブのコールバックとスコープ

Given this plnkr

ときは&=を使用することが適切である、または親に直接関数を呼び出しますか? &でコールバックへの結合があるようだ(トランスクルーとスコープについて)

私はディレクティブをホストディレクティブで、モジュールに必要な以下のコードがあるとして、「=」記号で結合好む

が、according to the documentation好ましい方法、なぜ?

答えて

7

この種の決定は、まずあなたの懸念を分離しようとする観点からなされるべきです。したがって、親スコープでメソッドを呼び出すことを排除する必要があります。このディレクティブは、親についてあまりにも多くを知っていなければなりません。

次に、目的を検討します。コールバックは定義によるメソッドです。 &は、親スコープのコンテキストで式を評価し、双方向バインディングは変数名にすぎません。 &lotより強力であり、あなたの指示のユーザーにより柔軟性を与えます。確かに、彼らはこの、あなたの例のように行うことができます:

<my-dir cb="callMe()"></my-dir> 

をしかし、彼らはまた、これを行うことができます:

<my-dir cb="myVar = false"></my-dir> 

を我々は変数の名前を渡す必要はありません - それは任意のです AngularJS expression。したがって、コンポーネントのユーザーは、あなたのイベントに合った方法で自由に対応することができます。驚くばかり!

しかし、指示文は状態の変化に反応することもできます。たとえば、あなたが条件をチェックできます。

<my-dir cb="myVar"></my-dir> 

そしてmyVarを任意の値に評価することができ、あなたのディレクティブは認識して、いつでもこれを変更し、それに応じて反応させることができます。 変数を共有する代わりに、という表現を共有しています。この場合、双方向バインディングが機能しますが、ディレクティブがその変数を変更しない(そして、そうでなければならない)場合、なぜ双方向バインディングが必要ですか?

ただし、変数である必要はありません。 trueまたはfalseと評価される式はどうですか?

<my-dir cb="myVar == myOtherVar"></my-dir> 

当社のディレクティブは、親スコープが値に到達したかを気にする必要はありません - 値が最終的あるものだけ。

親スコープでディレクティブに反応したり、ディレクティブが親に反応したりするために使用できます。すべて柔軟な表現です。きちんとした

したがって、=はデータバインディングを保証するためのものです。ディレクティブが使用されたスコープとディレクティブ自体が特定の変数に同期していることを保証します。&を使用すると、親スコープのコンテキストで式を評価したり、ディレクティブまたは親スコープのいずれかで式を評価したり、潜在的に複雑な状態の変化に反応することができます。

+0

ありがとう、これは私には明らかです。式を評価し、親スコープにバインドします。 – Jason

関連する問題