11

私は AngularJS を使い始めたばかりなので、専門家ではありません。

HTML ビューの右側の領域を表す div があります。そのdivにはコントローラーがあります。

<div class="rightContainer" ng-controller="rightContainerCtrl">...</div>

その div 内にはテーブル、検索領域などがあります。その div 内の各領域には独自のコントローラーがあり、次のようになります。

<div class="rightContainer" ng-controller="rightContainerCtrl">
...
   <div class="search" ng-controller="searchCtrl">...</div>
...
   <div class="table" ng-controller="tableCtrl">...</div>

 </div>

たとえば、検索領域には独自のコントローラーがあり、親 (rightContainerCtrl) の一部のコンテンツを変更する必要があるため、rightContainerCtrl の子ですが、rightContainer div は成長しており、大きくなり、いくつかのネストされたコントローラーが含まれています。

このネストされたコントローラーを使用することは、このコンテキストでは悪いと思います。ネストされたコントローラーはすべて親スコープを共有し、すべてのコントローラーがすべての親スコープ変数にアクセスする必要があるわけではなく、すべてのコントローラーが rightContainerCtrl の「囚人」であるため、それらは親コントローラーと高度に結合されています。

これは神のオブジェクトのアンチパターン (この場合は神のコントローラー) のように見えるので、ネストされたコントローラーを使用する代わりに、コードをリファクタリングして rightContainerCtrl コントローラーを削除し、代わりにサービスを使用できると思います (ファサード デザイン パターンのように)。そのサービスは、スコープ変数を共有する代わりにコントローラーによって使用されます。

しかし、私はAngularJsの専門家ではないので、私が正しいかどうか、またはこの親コントローラーを離れた方がよいかどうかはわかりません。おそらく何かが足りないので、私の質問は

ネストされたコントローラー (ネストされたスコープ) を使用する方が良いのはいつですか? angularjs で代わりにサービスを使用する方が良いのはいつですか?

4

2 に答える 2

17

コントローラー/スコープの階層は、データ/モデルがアプリケーションでどのように共有されるかを決定するべきではありません。Angular でのデータ共有について考えるときは、依存性注入を考えてください。

@shaunhusain の回答で参照されているビデオで、Misko は、スコープはモデルではなくモデルを参照する必要があると述べています。モデル/データは通常、サービス内にある必要があります。

Angular アプリを作成するときは、まずモデルについて考えてください。モデルを取得/編集/操作するためのAPI を使用してサービスに配置します。次に、ビューを設計します。各ビューは、モデルのサブセットを投影/使用/操作する必要があります。モデルの必要なサブセットをビューに単に接着する各ビューのコントローラーを定義します。コントローラーをできるだけ薄くします。

(コントローラーに名前をrightContainerCtrl付けることもお勧めしません。コントローラーはプレゼンテーション/レイアウトについて認識すべきではありません。)

于 2013-07-22T19:03:15.990 に答える
7

これは 100% の判断であり、いくつかの点に基づいている必要があります。

イベントを使用すると、非常に疎結合のコンポーネントが作成されます。文字通り、相互に認識する必要はありません。一部の親コントローラーが (サービスを介して) 一連のコントローラー間で通信する必要性を軽減する状況がある場合は、おそらくより良い方法です。解決。

ただし、それぞれのコントローラーがサービスに依存することに問題がない場合 (実際には問題ではありません)、コントローラー間で変更を通信する手段としてサービスを使用することができます。シングルトンに対する多くの議論を見てきました (サービスはフレーバーであり、挿入されたシングルトンですが、それでもシングルトンです)。これらの議論はほとんどが議論の余地があり、一般的に真にエレガントで簡潔な解決策が欠けていることがわかりました。A - D からどのように移動するかについて議論が何度も噴出する場合、B 道路を使用したくありませんが、道路 CI を提供しているようには見えません。要点がわかりません。

http://www.youtube.com/watch?v=ZhfUv0spHCY&t=30m34s

ビデオの正確なポイントを見つけることができませんでしたが、ここの最後のどこかで、彼はコントローラーとサービスの使用法について議論しています (彼は、いわばグローバルスコープを汚染する必要がなくなる双方向データバインディングについてもレビューしています) .

于 2013-07-22T18:04:14.027 に答える