更新 (2015 年 3 月): Ext 5.0 ではViewControllersが導入され、このスレッドで議論されている問題のほとんどに対処する必要があります。利点:
- ViewController 内のコンポーネント参照に関するスコープの改善/強化
- アプリケーションのフロー制御ロジックとは別に、ビュー固有のロジックを簡単にカプセル化できます。
- フレームワークによって管理される ViewController ライフサイクルと、関連付けられているビュー
Ext 5 は引き続き既存のExt.app.Controller
クラスを提供し、下位互換性を維持し、アプリケーションの構造化方法の柔軟性を高めます。
元の答え:
Ext JS の MVC では、コントローラーはビューの要素のレンダリングを認識している必要があります。これは、コントローラーがそれらの要素にフックし、それらのイベントをリッスンするためです。これは、ビューの要素が変更された場合 (たとえば、ボタンがリンクになるなど)、コントローラー内の関連するセレクターも変更される必要があることを意味します。言い換えれば、コントローラーはビューの内部構造に密結合されています。
ほとんどの場合、あなたが引用した正確な理由から、これが最良の選択ではないことに実際に同意します.ExtとTouchに同梱されているほとんどの例が、ビューのカプセル化に違反するセレクターを使用して定義されることが多い参照と制御関数を示しているのは残念です. ただし、これは MVC の要件ではありません。例がどのように実装されているかだけであり、回避するのは簡単です。
ところで、真のアプリケーションコントローラー (制御アプリ フローと共有ビジネス ロジック、ビューから完全に分離する必要があります。これらはあなたが言及しているものです) とビューコントローラー (control/ビューに固有のイベント ロジック (設計により密結合)。後者の例は、ビュー内のウィジェット間を完全に内部的に調整するロジックです。これは一般的な使用例であり、ビュー コントローラーをそのビューに結合することは問題ではありません。これは、ビュー クラスを可能な限りダムに保つコード管理戦略にすぎません。
問題は、ほとんどの文書化された例では、すべてのコントローラーが必要なものを参照するだけであり、それは優れたパターンではないことです。ただし、これは Ext の MVC 実装の要件ではありません。これは、例で使用されている単なる (怠惰な?) 規則です。代わりに、アプリケーション コントローラーに公開する必要があるものに対して、ビュー クラスに独自のカスタム ゲッターとイベントを定義させるのは非常に簡単です (そして、私はそれをお勧めします)。config は単なる省略形です。refs
いつでもmyView.getSomeReference()
自分のようなものを呼び出すことができ、返されるものをビューに指示させることができます。this.control('some > view > widget')
ビューでカスタムイベントを定義するだけでなく、this.control('myevent')
そのウィジェットがコントローラーが知る必要があることを行うときに実行します。そのように簡単です。
欠点は、このアプローチにはもう少しコードが必要であり、単純なケース (例など) ではやり過ぎになる可能性があることです。しかし、実際のアプリケーションや共有開発では、それがはるかに優れたアプローチであることに同意します。
そうです、アプリ レベルのコントローラーを内部のビュー コントロールにバインドすること自体がアンチパターンです。しかし、Ext の MVC はそれを必要とせず、自分で行うのを避けるのは非常に簡単です。