私はモジュールパターンを実装しており、イベントリスナ/ハンドラを定義して登録するための最良の方法を知りたいと思います。以下の作品は、多分、より良い/簡単な方法があります...Javascriptモジュールのパターンイベントとリスナー
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");
はそれを試してみてください:
はmyEventx、myEventHandlerx、とのaddListenerを持っている多くの作業のように思えます?
あなたは 'のaddListener()'を呼び出すと、渡された 'func'パラメータを参照_Global_変数として' myEvent1Handler'または 'myEvent2Handler'を作成するということではないでしょうか? 'myEvent1'関数で' this.myEvent1Handler = ... ' - そして' this.myEvent1Handler() 'と言う以外は、あなたのオブジェクトにすでに定義されている同じ名前のプロパティを設定しません。 (あるいは 'MODULE.myEvent1Handler'は' method1'に 'MODULE.myEvent1()'を持っているようです。) – nnnnnn
あなたは実際どのような問題を解決しようとしていますか?これは実際には何もしませんが足場を作るオーバーヘッドのようです。おそらく、実際に達成しようとしていることが分かっていれば、それを実行する最良の方法を見つける手助けをすることができます。 – jfriend00
ありがとう... MODULEのユーザーがイベントにフックできるように、私はMODULEでイベントを起こしたいと思います。 MODULEメソッドは非同期要求(jqueryを使用)を持つので、イベントを使用して非同期要求が完了したことを示したいとします。 – ZimSystem