良い質問。これらの種類の決定は、懸念を分離しようとする観点から最初に行う必要があります。したがって、親スコープでメソッドを呼び出すことを排除する必要があります。ディレクティブは、親についてあまりにも多くのことを知っている必要があります。
次に、目的を見ていきます。コールバックは、定義上、メソッドです。&
親スコープのコンテキストで式を評価しますが、双方向バインディングは単なる変数名です。&
ははるかに強力であり、ディレクティブのユーザーにより多くの柔軟性を提供します。確かに、あなたの例のように、彼らはこれを行うことができます:
<my-dir cb="callMe()"></my-dir>
しかし、彼らはこれを行うこともできます:
<my-dir cb="myVar = false"></my-dir>
変数の名前を渡す必要はありません-それは任意のAngularJS式です。したがって、コンポーネントのユーザーは、自分に合った方法でイベントに自由に反応できます。素晴らしい!
しかしまた、ディレクティブは状態の変化に反応することができます。たとえば、次の条件を確認できます。
<my-dir cb="myVar"></my-dir>
そしてmyVar
、任意の値に評価することができ、これが変更されたときにいつでもディレクティブを認識させ、それに応じて対応することができます。変数を共有する代わりに、式を共有しています。この場合、双方向バインディングは機能しますが、ディレクティブがその変数を変更しない(そしておそらく変更すべきではない)場合、なぜ双方向バインディングが必要なのですか?
しかし、繰り返しになりますが、変数である必要はありません。trueまたはfalseと評価される式はどうですか?
<my-dir cb="myVar == myOtherVar"></my-dir>
私たちのディレクティブは、親スコープがどのように値に到達するかを気にする必要はありません。最終的に値が何であるかだけを気にする必要があります。
したがって、親スコープがディレクティブに反応するため、またはディレクティブが親に反応するために、すべて柔軟な式で使用できます。きちんとした。
つまり、=
データバインディングを確保するためです。これにより、ディレクティブが使用されたスコープとディレクティブ自体が特定の変数で同期されたままになります。&
親スコープのコンテキストで式を評価し、ディレクティブまたは親スコープのいずれかが潜在的に複雑な状態変化に反応することを可能にします。