Javascript Module Pattern Events und Listener
Ich bin der Implementierung des module-Muster, und würde gerne wissen, der beste/bevorzugte Methode zum definieren und registrieren Sie Ereignis-Listener/handlers. Das folgende funktioniert, aber vielleicht gibt es eine bessere/einfachere Möglichkeit...
var MODULE = function() {
// private
var _field1;
var _field2;
function localFunc(p) {
alert('localFunc');
}
// public
return {
//properties
prop1: _field1,
//events
myEvent1Handler: {},
myEvent1: function() {myEvent1Handler();},
myEvent2Handler: {},
myEvent2: function() {myEvent2Handler();},
addListener: function (event,func) {
if (event == "myEvent1")
myEvent1Handler = func;
if (event == "myEvent2")
myEvent2Handler = func;
},
//public methods
method1: function (p) {
alert('method1 says:' + p);
MODULE.myEvent1();
},
method2: function (p) {
alert('method2 doing stuff');
localFunc(p);
MODULE.myEvent2();
}
};
}();
//register for events
MODULE.addListener("myEvent1",function(){alert('fired1');});
MODULE.addListener("myEvent2",function(){alert('fired2');});
//use module (only event1 should fire!)
MODULE.method1("hello");
Probieren Sie es aus:
Scheint wie eine Menge Arbeit zu haben myEventx, myEventHandlerx, und addListener?
- Wenn Sie anrufen
addListener()
, ist nicht, dass die SchaffungmyEvent1Handler
odermyEvent2Handler
als Globale Variablen verweisen auf diefunc
parameter übergeben? Es wird nicht die Einstellung der Eigenschaften mit dem gleichen Namen bereits definiert in Ihrem Objekt, es sei denn, Sie sagenthis.myEvent1Handler = ...
- und dannthis.myEvent1Handler()
in IhremmyEvent1
Funktion. (OderMODULE.myEvent1Handler
wie SieMODULE.myEvent1()
immethod1
.) - Was für ein problem du eigentlich zu lösen versucht? Dies scheint wie eine Menge Aufwand, der nicht wirklich etwas tun, aber stellen Sie ein Gerüst. Vielleicht, wenn wir wüssten, was Sie eigentlich erreichen wollen, wir könnten Ihnen helfen, den besten Weg finden, das zu tun.
- Danke... ich will die Vielseitigkeit in-MODUL, so dass ein Benutzer des MODULS können die Haken in die Ereignisse. MODUL Methoden die async-requests (mit jquery), so will ich, um Ereignisse zu deuten, wenn ein async-request abgeschlossen ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Normalerweise würde ich nicht reagieren, um eine architektonische Frage, die mit einer bestimmten Implementierung (vor allem ein abhängig von einem 3rd-party-Bibliothek wie jQuery), aber da meine Implementierung fördert die Wiederverwendbarkeit und wir sprechen Muster hier — ich werde zu einem kleinen jQuery-plugin, $.eventable, das erweitert den JavaScript-Objekte mit jQuery-event-Methoden.
Diesem plugin können Sie implementieren event-handling-Funktion auf jedem Objekt (oder Instanz der Klasse) mit einem einfachen Aufruf.
Wenn Sie das snippet implementieren Sie Ihre Lösung wie diese:
Dein MODUL hat nun die folgenden aufrufbaren Methoden:
Dem event ist eine durch Leerzeichen getrennte Liste der Ereignisse, handler ist Ihr Rückruf und Daten ist ein optional zu übergebenden Wert auf Ihre Rückrufe.
Finden Sie in die jQuery-Dokumentation für mehr details.
Den sprechenden Modul-Muster hat Sie Rückgabe einem anonymen Objekt. Wenn Sie stattdessen deklarieren Sie ihn als variable und gibt es zurück, es bedeutet, Sie können mit der standard-jQuery-event-Methoden ziemlich einfach, sowohl innerhalb der module, die für das auslösen von Ereignissen und extern, auf Sie zu reagieren. Beachten Sie, dass Sie haben, um Sie in ein jQuery-Objekt vorher.