Zim*_*Zim 14 javascript module-pattern
我正在实现模块模式,并想知道定义和注册事件监听器/处理程序的最佳/首选方式.以下工作,但也许有更好/更简单的方式......
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");
Run Code Online (Sandbox Code Playgroud)
试试看:
看起来像myEventx,myEventHandlerx和addListener有很多工作要做?
小智 8
通常,我不会回应具有特定实现的架构问题(尤其是依赖于第三方库(如jQuery)的架构问题),但由于我的实现提升了可重用性 - 我们在这里讨论模式 - 我将提供一个小的jQuery插件,$ .eventable,它使用jQuery的事件方法扩充JavaScript对象.
这个插件允许您通过一个简单的调用在任何对象(或类实例)上实现事件处理功能.
jQuery.eventable = function (obj) {
// Allow use of Function.prototype for shorthanding the augmentation of classes
obj = jQuery.isFunction(obj) ? obj.prototype : obj;
// Augment the object (or prototype) with eventable methods
return $.extend(obj, jQuery.eventable.prototype);
};
jQuery.eventable.prototype = {
// The trigger event must be augmented separately because it requires a
// new Event to prevent unexpected triggering of a method (and possibly
// infinite recursion) when the event type matches the method name
trigger: function (type, data) {
var event = new jQuery.Event(type);
event.preventDefault();
jQuery.event.trigger(event, data, this);
return this;
}
};
// Augment the object with jQuery's event methods
jQuery.each(['bind', 'one', 'unbind', 'on', 'off'], function (i, method) {
jQuery.eventable.prototype[method] = function (type, data, fn) {
jQuery(this)[method](type, data, fn);
return this;
};
});
Run Code Online (Sandbox Code Playgroud)
如果您包含该代码段,则可以像这样实现您的解决方案:
var MODULE = function() {
// private
var _field1;
var _field2;
function localFunc(p) {
alert('localFunc');
}
// public
return $.eventable({
// properties
prop1: _field1,
// public methods
method1: function(p) {
alert('method1 says:' + p);
this.trigger('myEvent1');
},
method2: function(p) {
alert('method2 doing stuff');
localFunc(p);
this.trigger('myEvent2');
}
});
} ();
// register for events
MODULE.on("myEvent1", function() {
alert('fired1');
});
MODULE.on("myEvent2", function() {
alert('fired2');
});
// use module (only event1 should fire!)
MODULE.method1("hello");
Run Code Online (Sandbox Code Playgroud)
您的MODULE现在具有以下可调用方法:
MODULE.on(event, /* data, */ handler);
MODULE.bind(event, /* data, */ handler);
MODULE.one(event, /* data ,*/ handler);
MODULE.off(event, handler);
MODULE.unbind(event, handler);
MODULE.trigger(event /*, data */);
Run Code Online (Sandbox Code Playgroud)
where事件是以空格分隔的事件列表,handler是您的回调,data是传递给回调的可选值.
您可以参考jQuery的文档以获取更多详细信息.
| 归档时间: |
|
| 查看次数: |
7985 次 |
| 最近记录: |