2

グリッド ウィジェットの複雑なディレクティブを作成していますが、どこでグリッド ディレクティブ API を公開すればよいかわかりません。つまり、プロパティ (例: selectedItems) とメソッド (例: scrollRowIntoView(rowIndex)) です。

私が検討しているオプションは次のとおりです。

  1. スコープで API を公開します(私のディレクティブは分離スコープを定義しました)。
  2. ディレクティブのコントローラーで API を公開します(私が正しく理解している場合、これは で行われたこと ngFormDirectiveです)。
  3. APIを公開するスコープでグリッド オブジェクトを公開します。
  4. 以前のオプション間のある種の混合(たとえば、スコープで公開されたプロパティ、コントローラーのメソッド)。

私が知りたいのは:

  • このユースケースのベストプラクティスはありますか?
  • それぞれの選択肢の長所と短所は何ですか?
  • 他に有効な代替手段はありますか?

ありがとう!

4

1 に答える 1

0

通常、バインディングをディレクティブの属性として公開する必要があります。つまり、配列someItemsをグリッドにバインドする場合、ディレクティブは次のようになると思います<my-grid my-items="someItems">

「グリッドのサイズが変更されたときにこの関数を実行する」などの属性としてフックを公開することもできます。スコープに関数がある場合は、次のwhenGridResizedように、それも属性として設定します<my-grid onresize="whenGridResized()">

他の場合では、scrollRowIntoView()例のように属性を実際に使用することはできません。これは、ディレクティブコントローラーで公開するのに適した候補です。これは、システムで他のことが発生したときにディレクティブユーザーが呼び出したいもの(DOMイベントなど)であるためです。

したがって、APIを、グリッド内で発生するイベント(制御するもの)の属性として公開する必要がありonresizeますondelete。もちろん、コントローラーでそれらを公開することもできます。

ディレクティブがのような外部イベントに反応する必要がある場合scrollRowIntoView()、属性などのフックを公開するのは不格好なAPIになるため、ディレクティブコントローラーでそれを公開します。

グリッドに分離されたスコープが必要なため、スコープを介してAPIを公開しないでください。スコープを介して公開すると、スコープを親に設定する必要があり、親スコープに直接アクセスすることはほとんどありません。

TL; DR

経験則では、属性が意味をなさない場合は、属性とディレクティブコントローラーのメソッドをできるだけ多く公開することです。ユーザーがディレクティブをどのように使用するかを予測するのは難しいため、属性とコントローラーの両方で同じ機能を公開することをお勧めします。

于 2013-03-07T09:51:56.640 に答える