93

いつディレクティブを使用するのか、いつ nginclude を使用するのがより適切なのか、よくわかりません。この例を見てみましょう:password-and-confirm-input-fields.htmlパスワードを入力して確認するための html であるパー​​シャル があります。これは、サインアップ ページとパスワード変更ページの両方で使用します。これらの 2 つのページにはそれぞれコントローラーがあり、部分的な html には専用のコントローラーはありません。

ディレクティブまたはngIncludeこれを使用する必要がありますか?

4

1 に答える 1

122

それはすべて、コードフラグメントに何を求めるかによって異なります。個人的には、コードにロジックがない場合、またはコントローラーさえ必要ない場合は、ngInclude. 私は通常、ここでビューを乱雑にしたくない、より大きな「静的」html フラグメントを配置します。(つまり、データがとにかく親コントローラーから取得される大きなテーブルとしましょう。<div ng-include="bigtable.html" />ビューを乱雑にするすべての行よりもクリーンです)

ロジック、DOM 操作がある場合、または使用されるさまざまなインスタンスでカスタマイズ可能にする必要がある場合 (別の方法でレンダリングする必要がある場合)directivesは、より良い選択です (最初は困難ですが、非常に強力です。時間をかけてください)。 .

ngInclude

場合によっては、それらの外部/ngInclude'sの影響を受けていることがわかります。大規模/複雑なリピーターなどと言えます。このため、これら 2 つのインターフェイスは結び付けられています。メインの何かが変更された場合は、含まれているパーシャル内のロジックを変更/変更する必要があります。$scopeinterface$scope

ディレクティブ

一方、ディレクティブには明示的なスコープ/コントローラーなどを含めることができます。したがって、何かを複数回再利用する必要があるシナリオを考えている場合は、独自のスコープを接続することで、作業がいかに簡単になり、少なくなるかがわかります紛らわしい。

また、DOM とやり取りするときはいつでも、ディレクティブを使用する必要があります。これにより、テストがしやすくなり、これらのアクションをコントローラー/サービス/などから切り離すことができます。これはあなたが望むものです!

ヒント: IE8 に関心がある場合は、restrict: 'E' を使用しないでください。これを回避する方法はありますが、面倒です。生活を楽にして、属性などに固執してください。<div my-directive />

コンポーネント[2016 年 3 月 1 日更新]

Angular 1.5 で追加された、これは基本的に のラッパー.directve()です。ほとんどの場合、コンポーネントを使用する必要があります。デフォルトでrestrict: 'E', scope : {}, bindToController: true. Angular2 に簡単に移行できるように、アプリのほとんどすべてにこれらを使用することを強くお勧めします。

結論は:

ほとんどの場合、コンポーネントとディレクティブを作成する必要があります。

  • より拡張可能
  • ファイルをテンプレート化し、外部で使用できます (ngInclude など)。
  • 親スコープを使用するか、ディレクティブ内で独自の分離スコープを使用するかを選択できます。
  • アプリケーション全体での再利用の改善


2016 年 3 月 1 日更新

現在、Angular 2 はゆっくりとまとめられており、一般的な形式 (もちろん、あちこちでいくつかの変更があるでしょう) は、実行することがいかに重要であるかを追加したかっただけですcomponents(制限する必要がある場合はディレクティブ: ' E' など)。

コンポーネントはAngular 2 のものと非常によく似@Componentています。このようにして、ロジックと html を同じ領域にカプセル化しています。


できる限り多くのものをコンポーネントにカプセル化してください。これにより、Angular 2 への移行がはるかに簡単になります! (移行を選択した場合)

これは、この移行プロセスを説明する素晴らしい記事ですdirectives(もちろん、コンポーネントを使用する場合は非常に似ています): http://angular-tips.com/blog/2015/09/migrating-directives-to-angular-2/

于 2014-06-11T20:29:55.787 に答える