8

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

このplnkrを考えると

&=、または親で関数を直接呼び出すのが適切なのはいつですか?

ディレクティブとディレクティブをホストするモジュールで必要なコードが少ないため、「=」記号でバインドすることを好みますが、ドキュメント(Understanding Transclusion and Scopes) によると、コールバックへのバインドが&推奨される方法のようです。 、 どうして?

4

1 に答える 1

7

良い質問。これらの種類の決定は、懸念を分離しようとする観点から最初に行う必要があります。したがって、親スコープでメソッドを呼び出すことを排除する必要があります。ディレクティブは、親についてあまりにも多くのことを知っている必要があります。

次に、目的を見ていきます。コールバックは、定義上、メソッドです。&親スコープのコンテキストで式を評価しますが、双方向バインディングは単なる変数名です。&はるかに強力であり、ディレクティブのユーザーにより多くの柔軟性を提供します。確かに、あなたの例のように、彼らはこれを行うことができます:

<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>

私たちのディレクティブは、親スコープがどのように値に到達するかを気にする必要はありません。最終的に値が何であるかだけを気にする必要があります。

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

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

于 2013-03-03T17:55:56.470 に答える