【发布时间】:2011-11-11 20:48:02
【问题描述】:
我正在实现模块模式,并且想知道定义和注册事件侦听器/处理程序的最佳/首选方式。以下工作,但也许有更好/更简单的方法......
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()时,不就是创建myEvent1Handler或myEvent2Handler作为global变量引用传入的func参数吗?它不会设置已在对象中定义的同名属性,除非您在myEvent1函数中说this.myEvent1Handler = ...- 然后是this.myEvent1Handler()。 (或者MODULE.myEvent1Handler就像你在method1中拥有MODULE.myEvent1()一样。) -
你真正想解决什么问题?这似乎是很多开销,实际上除了搭建脚手架之外什么也没做。或许如果我们知道您真正想要完成的工作,我们可以帮助您找到最好的方法。
-
谢谢...我想在 MODULE 中进行事件,以便 MODULE 的用户可以挂钩事件。 MODULE 方法将有异步请求(使用 jquery),所以我想使用事件来指示异步请求何时完成。