Angular でのモデルの使用は混乱を招きます。Angular は、モデルを好きなものにできるというアプローチを取っているようです。IE Angular には明示的なモデル クラスが含まれておらず、標準の JavaScript オブジェクトをモデルとして使用できます。
私が見たほぼすべての Angular の例では、モデルは事実上、手動で作成されたか、リソースを介して API 呼び出しから返されたオブジェクトです。私が見たほとんどすべての Angular の例は単純であるため、通常、モデル データはコントローラーの $scope に保存され、モデルに関連する状態 (選択など) もコントローラーの $scope に保存されます。これは単純なアプリ/例では問題なく機能しますが、アプリがより複雑になると単純化しすぎているように思えます。コントローラーに格納されたモデルの状態は、コンテキストに依存するようになり、コンテキストが変更された場合に失われるリスクがあります。たとえば、次のような場合です。コントローラーを格納selectedGallery
し、globalselectedPhoto
のみを格納できます。selectedImage
selectedPhoto
ギャラリーごと。このような状況では、ギャラリーごとにコントローラーを使用すると、この問題が解消される可能性がありますが、UI の観点からは無駄であり、おそらく不適切で不必要に見えるでしょう。
Angular のモデルの定義は、サーバーとクライアントの間で渡されるダム オブジェクトである VO/DTO に近いと思われます。私の本能は、そのようなオブジェクトをモデルと見なすものにラップすることです。これは、DTO/VO に関連する状態 (選択など) を維持し、DTO/VO を操作するために必要に応じてミューテーターを提供し、残りのオブジェクトに通知するクラスです。基になるデータへの変更の適用。明らかに、この最後の部分は Angular のバインディングによって適切に処理されますが、最初の 2 つの責任については依然として強力なユースケースが見られます。
しかし、私が見た例でこのパターンが使用されているのを実際に見たことはありませんが、スケーラブルな代替手段と見なすものも見たことがありません。Angular は、Singleton を強制することで、サービスをモデルとして使用することを暗黙のうちに思いとどまらせているようです (これを回避する方法があることは知っていますが、それらは広く使用されたり承認されたりしていないようです)。
では、モデル データの状態を維持するにはどうすればよいでしょうか。
[編集]この質問の 2 番目の回答は興味深いもので、私が現在使用しているものに近いものです。