2

KnockoutJS フレームワークと MVVM を一般的に使用しているときに発生し続ける問題に取り組んでいます。コレクション内の特定のアイテムのプロパティが変更される場合があり、その変更のために、同じコレクション内の他のすべてのアイテムに影響を与える必要があります。すべての言語とパターンで、オブジェクトはそれが含まれるコレクションについて何も「認識」する必要はありませんが、特定の種類のロジックを機能させるために、そのルールを頻繁に破る必要があることに気づきました。

私がこの問題を解決してきたハッキーな方法を示すために、私が話していることの不自然な例を作成しました。経験豊富な人が参加して、これを行うためのより良い方法を教えてくれることを願っています.

JSFiddle の不自然な例

4

2 に答える 2

3

これが「推奨される」アプローチかどうかはわかりませんが、この問題にどのように取り組むかについてアドバイスを提供します。私は 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

私が役に立てば幸いです:)

于 2012-06-11T20:58:40.277 に答える
0

私があなたのシナリオを誤解していない限りcomputed、その場で自動的に更新されるオブザーバブルを使用できます。

まず、各人の「未成年」プロパティフラグは、分と比較した年齢の計算に過ぎないと考えました。年。例えば19。

第二に、computedオブザーバブルを使用して、すべてのユーザーの集計フラグを実行することもできます。

最後に、これが親子関係であることに必ずしも同意するわけではありません。これらは、ページに固有のビュー モデルの単なるプロパティです。

両方のケースで計算されたものを使用するこの例を確認してください。 http://codepen.io/anon/pen/ufKCo

于 2012-10-10T19:46:29.873 に答える