またはモデルMediator
を使用してイベント委任を行うフレームワークをすでに持っている場合、aの記述は非常に簡単です(それらが呼び出されるか、システムを呼び出すか、または何でも)。publisher/subscriber
observer
events
actions
emitter
Mediator
唯一の//etcを作成し、modules / classes emitter
/ publisher
services/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
メソッドを呼び出すと、同じメディエーターを共有し、そのイベントをリッスンしているモジュールに通知されます。