私は適度なサイズのアプリケーションを組み立てており、コードをファクタリングして、維持される行の全体数を減らし、パフォーマンスの調整を行っています。この質問を投稿するユースケースは、フォームを表示するコントローラーのメソッドを呼び出す (または呼び出す必要がある) ボタンがメニューに埋め込まれていることです。これは現在、特定のボタン コントロールへの直接参照を使用して実装され、パネルを作成し、そのパネルをビューポート内に配置します。
ExtJS 4.1 Call One Controller From Anotherでの質問は、応答の終わり近くでベスト プラクティスの問題に対処し始めますが、より複雑な実装をカバーするために再現または拡張できる基本ケースに実際には決着していません (が私の質問の目的です。)
2 つのコントローラーがあるとします。
「メインメニュー」コントローラー。
// controller/Menu.js
Ext.define("App.controller.Menu", {
extend: "Ext.app.Controller",
init: function () {
this.control({
"viewport > mainmenu > button": function (ctl, evt) {
}
});
}
});
ユーザー アカウント コントローラー
// controller/User.js
Ext.define("App.controller.User", {
extend: "Ext.app.Controller",
stores: ["User"],
views: ["user.Edit", "user.List"],
init: function () {
}
});
質問
「Create a New Account?」のメニュー ボタンのクリック イベントに応答する責任を適切に委任するために、2 つのコントローラー間のクロスワイズ接続を実装する (最善の) 方法は何でしょうか?
考えられる解決策の 1 つ
componentquery を使用すると、ユーザー コントローラーがイベントに直接応答するようにタグ プロパティを使用して、メイン メニュー ビューのボタンのフォーカスを簡単に絞り込むことができます。
// controller/User.js
"viewport > mainmenu > button [tag=user.create]": function () {}
未知の代替手段
または、オブジェクト グラフを介してメニュー コントローラーからユーザー コントローラーへの参照を見つけ、その方法で呼び出すこともできます。
// controller/Menu.js
// switch on tag case "user.create"
App.controller.User.createUserForm()
本当の質問
これらすべてから生じる問題は、ここで「最も受け入れられる」ソリューションは何かということです。リクエストをコントロールからコントローラーに「ルーティング」するために、3 番目の仲介コントローラーを使用することを想像することもできますが、それはフレームワークの残りの部分が行おうとしていることに反すると思います。これらの方法のいずれかのバリエーションを使用すると、現在は機能しますが、どちらも完全にクリーンで信頼できるとは思えません。または最終的には長期的に保守可能 (コードがかなり急速に広がるため)。さらに、生のイベントにドロップするという考えが浮かびましたが、同じ種類の保守性の問題に遭遇しました。