これが「推奨される」アプローチかどうかはわかりませんが、この問題にどのように取り組むかについてアドバイスを提供します。私は MVVM の専門家ではありません (かなりの数の KnockoutJS アプリを作成しました) が、ここではいくつかの OOP 原則が十分に役立つと思います。
ということで、まずは現状をおさらい…
あなたが正しく観察したように(ノックアウトしゃれは意図的ではありません!)、あなたのアプローチは理想的ではありません-Person
オブジェクトは兄弟だけでなく(サブスクリプションを介して間接的であっても)、サブスクライブしている親オブジェクトも認識しています-あなたのPerson
タイプはサブスクライブされています親の変更に。これにより、オブジェクトがこのシナリオ以外では使用できなくなるだけでなくPerson
、各インスタンスに過度の責任が与えられ (単一責任の原則に違反します)、各インスタンスは他のすべてのインスタンスの変更にサブスクライブされます。これはもちろん無駄です!
それで、解決策は何ですか?
この種のロジックを配置する理想的な場所は、親オブジェクト (つまり、ビュー モデル) です。あなたのビューモデルはすでにその子オブジェクトの知識を持っているので、そこに機能を入れてみませんか? これにより、Person
タイプが他の場所で再利用可能になり (Observable があるため、現時点では KO に関連付けられていますが、これは Mapping プラグインで克服できます)、兄弟を管理する責任から解放されます。
しかし、それでもこれは、親と子の間に密結合があることを意味します。これは、OOP で必要なことではありません。これを克服するには、pub/sub (オブザーバー) パターンを採用し、Person
何かが変更されるたびにタイプにメッセージを発行させ、サブスクライバー (ビュー モデルなど) にこのイベントへの応答方法を決定させることができます。ノックアウトの pub/sub オファリングも必ずしも使用する必要はありません。任意の pub/sub 実装で使用できます。KOが提供するものを利用することもできますが、これらの拡張機能/ヘルパーの方向性を示して、物事を少し楽にします: http://www.knockmeout.net/2012/05/using-ko-native -pubsub.html
私が役に立てば幸いです:)