簡単に言うと、質問です。
MVCでは、チェックボックスのクリック(または選択ボックスまたはリストボックスの変更)と人間の意味での「コントローラー、モデルの変更」と、チェックボックスのクリック(または選択ボックスまたはリストボックスの変更)とコントローラーの意味での「私」をどのように区別しますかmモデルが変更されたため、ビューを更新しますか?」
例:
「Edges」で接続された「Vertices」の概念を持つJSアプリ(すべて1つの大きなHTML + JSページ。背後にサーバーがあり、AJAXが実行されていますが、例では重要ではありません)があります。UIを使用すると、マップ上の頂点を追加および削除したり、頂点のペア間のエッジを有効または無効にしたりできます。
頂点Aから頂点Bへのエッジを無効にする方法は2つあります。
- エッジをクリックして、[エッジの詳細]ウィンドウに[このエッジを無効にする]ボタンを表示します。また
- 頂点A(またはB)をクリックして、[頂点の詳細]ウィンドウに近くの頂点のチェックリストを表示し、そこから頂点B(またはA)のチェックを外すことができます。
これがMVCの内部でどのように機能するかを示します(ただし、私の理解の問題を修正する更新については、この投稿の最後を参照してください):
- モデル:頂点オブジェクトのリストとエッジオブジェクトのリスト。
- ビュー:マーカーとポリラインに加えて、チェックボックスとボタン、および「頂点の詳細」と「エッジの詳細」のDIVを備えたGMapsUI。
- コントローラ:
- チェックボックスとボタンのイベントが発生したときにモデルを更新するJS関数。と
- モデルのイベントが発生したときにビューを更新するJS関数。
これが特定の優雅さです:
- ユーザーは、頂点Aに焦点を合わせた頂点詳細ウィンドウと頂点Aから頂点Bへのエッジに焦点を合わせたエッジ詳細ウィンドウを持っています。
- ユーザーは、[エッジの詳細]ウィンドウで[このエッジを無効にする]をクリックします。
- コントローラ関数1はクリックイベントを取得し、Edgeモデルオブジェクトでdisable()を呼び出します。
- Edgeモデルオブジェクトは、「Ijustgetdisabled」イベントを発生させます。
- コントローラ機能2は、「無効になりました」イベントを受け取り、
- エッジ詳細ウィンドウを再描画して、「無効になっています!」と表示します。と
- [頂点の詳細]ウィンドウで[頂点B]のチェックを外します。
- くだらない!これにより、エッジが無効になったことを意味するUIイベントをリッスンしていたコントローラー関数1が再度起動されます。
そのため、モデルの不要な再更新とビューの再更新があります。イベントを発生させるイベントを発生させるイベントを含むより複雑なビューでは、これにより、数十の無関係な更新が行われる可能性があります。
更新:素晴らしい答え。
私はMVCを少し誤解しました。上で説明したように、ビューは1つだけではありません。複数のモデルに複数のビューがあります。特に、特定のノードに対するチェックボックスリストのエッジのビューと、別の「詳細なウィンドウスタイル」のエッジのビューがあります。
さらに、モデルが変更されたときにすべてのビューを更新する1つのコントローラー関数を使用するべきではありません。モデルが変更されたときに、各ビューはそれ自体を変更する必要があります。
したがって、各ビューがモデルの「状態更新」イベントに登録され、各ビューがそれらのイベントの受信時にそれ自体を更新する場合、私の循環イベントの質問に対する答えは単純に次のようになります。
チェックボックスリストビューは、モデルの状態が変更された後にチェックボックスを更新している間、チェックボックスイベントを無効にします。
これで、ユーザーが[エッジの詳細]ウィンドウでエッジを無効にすると、コントローラーがエッジモデルを更新し、チェックボックスリストビューが更新の通知を受け取り、チェックボックスリストビューがスマートで、チェックボックスイベントを消音してステータスを変更します。適切なチェックボックス。
これは、1つのコントローラーがすべてのビューを更新する元のソリューションよりもはるかに口当たりが良く、ループを回避するために特別な注意とフィードが必要なビューを知る必要があります。代わりに、厄介なUI要素を持つ単一のビューだけが問題に対処する必要があります。
私の質問に答えてくれた人たちに感謝します!