0

私は ExtJs/Javascript でアプリケーションを構築しようとしていますが、イベントはコンポーネントを互いに独立した状態に保つ良い方法であることに気付きました。ただし、イベントを発生させてキャプチャする方法により、呼び出し元と受信者に固有のものになります。

これを行うより良い方法はありますか。私は、任意のコンポーネントが 1 つのイベントを発生させ、別のコンポーネントがそれをリッスンするために登録できる、1 つの中心的な EventBus クラスを作成することを計画しています。

このようなことを達成するためにすでに利用可能なライブラリはありますか。私が見ているのと同じことをしているかわからない backbone.js を見ました。

4

3 に答える 3

2

またはモデルMediatorを使用してイベント委任を行うフレームワークをすでに持っている場合、aの記述は非常に簡単です(それらが呼び出されるか、システムを呼び出すか、または何でも)。publisher/subscriberobservereventsactionsemitter

Mediator唯一の//etcを作成し、modules / classes emitter/ publisherservices/etcにそのアクセスを許可しMediatorます。

var myEvents = Mediator(),

Module1 = (function (events) {
    var private_data = {},
        private_method = function () {},
        public_interface = { init : init };

    function init () { // setup procedures
        events.listen("widget/process/request", function (data) {
            var result = doStuff(data);
            events.fire("widget/process/result", result);
        });
    }
}(myEvents)),

Module2 = (function (events) {
    var private_data = {},
        public_interface = { init : init };

    function init (data) { // setup procedures
        events.fire("widget/process/request", data);
        events.listen("widget/process/result", private_method);
    }

    return public_interface;
}(myEvents));


Module1.init();
Module2.init(data);

必要に応じて、クラス内で何かを実行してメディエーターをラップすることもできます。これにより、「クラス」/モジュールのパブリックメソッドを作成できます。これは、独自のイベントのように見えますが、データを渡します。調停人へ:

var myClass = function () {
    var mediator = null,
        public_interface = {
        fire : function (evt, data) { if (!mediator) { return; } mediator.fire(evt, data); },
        listen : function (evt, handler) { if (!mediator) { return; } mediator.listen(evt, handler); },
        setMediator : function (newMediator) { mediator = newMediator; }
    }
};

var mediator = Mediator(),
    obj1 = myClass(),
    obj2 = myClass();

obj1.setMediator(mediator);
obj2.setMediator(mediator);

obj1.listen("event1", obj1.doStuff.bind(obj1));
obj2.fire("event1", obj2.data);

これで、すべてのモジュールが1つのメディエーター、または選択した多数のメディエーターにアクセスできるようになります... ...各ウィジェットに独自のメディエーターを付与し、個々のコンポーネントが共有できるようになります... ...さらに、各ウィジェットにシステム全体のメディエーターであるため、コンポーネントはAJAXやDOMなどのグローバルサービスにアクセスできませんが、ウィジェット自体はアクセスできます。

また、コンポーネントにインターフェイスを提供することで、パブリックラッパー呼び出しを使用して(ラムダ/コールバックの多いJSの方法ではなく、メインプロセスでより古典的な方法で)きちんとプログラミングできます。

var imageLoader = ImageLoader();
imageLoader.setMediator(mediator);
img = imageLoader.load("myimg037");
imageLoader.fire("imageloader/imageloaded/myimg037", img);

または、プロジェクトで同様のことが見られるimageLoader場合があります。他のモジュールについては何も知りませんが、その.fireメソッドを呼び出すと、同じメディエーターを共有し、そのイベントをリッスンしているモジュールに通知されます。

于 2012-11-14T21:14:32.353 に答える
1

ozef Sakalos、別名 Saki による MsgBus プラグインをチェックしてください。

http://examples.extjs.eu/?ex=msgbus

ExtJS コンポーネント間のメッセージ パブリッシュ/サブスクライブ モデルを提供します。

于 2012-11-14T21:22:37.307 に答える
0

この機能は、 extjs4.x のコントローラーを介して既に実装されています。コントローラーは、イベントをリッスンして処理するための中心的な場所です。さらに、すべてのコンポーネントには、コントローラーでリッスンできるカスタム イベントを発生させるための fireEvent メソッドがあります。詳細については、ドキュメントを参照してください。

http://docs.sencha.com/ext-js/4-1/#!/guide/application_architecture

http://docs.sencha.com/ext-js/4-1/#!/api/Ext.app.Controller

于 2012-11-14T22:32:53.123 に答える