5

私は適度なサイズのアプリケーションを組み立てており、コードをファクタリングして、維持される行の全体数を減らし、パフォーマンスの調整を行っています。この質問を投稿するユースケースは、フォームを表示するコントローラーのメソッドを呼び出す (または呼び出す必要がある) ボタンがメニューに埋め込まれていることです。これは現在、特定のボタン コントロールへの直接参照を使用して実装され、パネルを作成し、そのパネルをビューポート内に配置します。

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 番目の仲介コントローラーを使用することを想像することもできますが、それはフレームワークの残りの部分が行おうとしていることに反すると思います。これらの方法のいずれかのバリエーションを使用すると、現在は機能しますが、どちらも完全にクリーンで信頼できるとは思えません。または最終的には長期的に保守可能 (コードがかなり急速に広がるため)。さらに、生のイベントにドロップするという考えが浮かびましたが、同じ種類の保守性の問題に遭遇しました。

4

1 に答える 1

0

いくつかの短い行:

私が理解していないことは、Sencha Touch にはルーティングがありますが、ExtJS にはイベント バスがありますがルーティングがないということです... (そして、MVC 実装が異なる点が他にもあります)このギャップを埋めるためにカスタム ルーティングを作成したときです。sencha はバージョン 5 でこれを追加するかもしれません。

  • 最も簡単で迅速な解決策:コントローラーの を使用して、メニュー コントローラーから担当getController()のコントローラーを呼び出します。Ext.app.Application
  • (imo)最良の解決策:各コントローラーがルートを登録し、両方を使用するルーターを自分で作成します。ルーティングとイベントバス。アプリに複数の開発チームが使用する共有コンポーネントがある場合、これは非常に便利です。
于 2013-02-15T10:01:03.260 に答える