私は最近、単一のモデルでサポートする必要がある複数のビューがページにあるという状況に遭遇しました。このように、モデルを変更するだけで、関連するすべてのビューの外観が自動的に更新されます。問題は、この atm を実現するには、これらのモデルを積極的に探すコードを作成する必要があることです。幸運にも、イベント ハンドラーを通じてモデルが提供されることがありますが、通常はそうではありません。一度にページにモデルの単一のインスタンスを配置し、他の場所でそのモデルを参照するだけの良い方法を探しています。人々は一般的にこのニーズにどのように対処していますか? バックボーン リレーショナルは、lawnchair.js を使用して中央ストアを維持することでそれを処理します。私は、単一のグローバル コレクションを使用してすべてのモデルのレジストリを維持する人々について聞いたことがあります。
1 に答える
短い答え:
複数のビューで共有される1つのモデル(「重複モデル」と呼ぶことができます)は、実際には完全に有効な(そして便利な)バックボーンパターンです。それはまったく問題ではありません。ここで問題がわかるのは、そのモデルを複数のビューに取り込むのが難しいということです。したがって、代わりにそれを解決することをお勧めします。
長い答え:
モデルを複数のビューに渡す場合の問題は、本質的にビューを結合することです(各ビューにその共有モデルを提供するには、「中間」ビューと同様に、親ビューにもそのモデルが必要です)。今ではプログラマーとして、物事を可能な限りカプセル化するように教えられてきたので、ビューの結合は最初は「間違っている」ように見えるかもしれません。ただし、実際には結合ビューが望ましいです。重要なのは、結合されるビューを適切に制限することです。
@Shaunaは、このための優れた経験則を提案しました。「ビューは、それ自体とその子を作成することだけを気にします。」このルールに従うと、ビュー間の結合に問題が発生することはなく、柔軟で保守可能なコードを作成できます(グローバル変数を使用する場合よりもはるかに保守可能であるため、カプセル化が実際に失われます。 )。
これらすべてに照らして、簡単な例を見てみましょう。すべてモデルXを使用するビューA、B、およびCがあり、コード内のまったく異なる場所にA、B、およびCを構築しているとします(これらの間でXを共有することは困難です)。
1)まず、なぜA、B、Cがこのように異なる場所に構築されているのかを見て、それらを近づけることができないかどうかを確認します。
2)それらをこれまで離れて構築する必要がある場合は、次に、それらに私が利用できる共通点があるかどうかを調べます。たとえば、これらすべてのスポットはすべて、関連するオブジェクトを共有していますか?もしそうなら、多分私達はそれを私達のすべてのビューと共有するためにそのオブジェクトにXを置くことができます。
2)コードの配置にも、A、B、Cの間の共通変数にも関係がない場合は、「本当にそれらの間でモデルを共有する必要があるのか」と尋ねる必要があります。
著者についての退屈な話:
私が最初にBackboneを使い始めたとき、私はグローバル変数を作成したかったので、同僚と議論することがよくありました。彼らは彼らにしっかりと反対していました。グローバルを使用できない場合は、Eだけが実際にそのモデルを必要とするのに、モデルをビューAからビューB、ビューC、ビューD、ビューEに渡す必要があることを説明しようとしました。このような廃棄物!
(私がそれ以来学んだように)を除いて、私は間違っていました。グローバルは、少なくとも保守性の観点からは恐ろしい考えです。それらを使い始めると、そのグローバル変数を使用するビュー間で通常持っているカプセル化が失われるため、どのコードが何に影響を与えているのかすぐにわかりません。また、意味のある大規模なプロジェクト(つまり、Backboneを使用する価値のあるプロジェクト)で作業している場合、カプセル化はコードを正常に保つ唯一の方法の1つです。
その間にBackboneを頻繁に使用してきましたが、正しい答えは、モデルを作成するときにモデルをビューに渡すことであると確信しています。これは、モデルを直接使用しない中間ビュー間でモデルを渡すことを意味する場合がありますが、そうすることで、グローバルを介してモデルを渡す場合よりもはるかに優れた、より保守しやすいコードが得られます。最初は厄介に感じるかもしれませんが、モデルを作成するときにモデルをビューに渡すのは適切な方法です。
Backboneに慣れると、モデルを複数の中間ビューに渡す必要があることはめったにないことに気付くでしょう。実際、「コードの臭い」を検出した複数のビュー間でモデルを渡さなければならないことに気付くと、実際の問題はコードのリファクタリングが必要になることに気付くでしょう。
ただし、Stack Overflowの他のすべてと同様に、マイレージは異なる場合があります;-)