[英]Custom events (observer pattern)
我找不到如何实现这个(我为自由式记录道歉):
//assign the event handler for the object "myObj"
myObj.onMyEvent = //do something
//if something happened somewhere, then run the event
MyEvent.fire();
我们的想法是调用(生成)一些自定义事件(MyEvent)。 我们有一个对象“myObj”能够识别“MyEvent”的出现,并以某种方式(以他自己的方式)来响应它。 另外,我们有其他对象(不同的排序),(以他们自己的方式)对“MyEvent”作出反应。
我知道有“观察者模式”,但我找不到具体的实现。
你能告诉我在哪里读一下吗? 或者在自然界中一般不可能? 或者完全不同?
更新1:没有JS库,请(jQuery,Prototype,YUI,...)
没有JS库,请(jQuery,Prototype,YUI,...)
我会认真地重新考虑这个要求。 所有这些库已经多次解决了这个或类似的问题。
但如果你想从头开始,做这样的事情:
window.customEvents = {
handlers : {
foo:[],
bar:[],
baz:[]
},
registerEventHandler:function(event, object, handler){
if(typeof(customEvents.handlers[event])=="undefined")
customEvents.handlers[event]=[];
customEvents.handlers[event].push([object, handler]);
},
fireEvent:function(eventName, data){
if(customEvents.handlers[event]){
for(var i = 0; i < customEvents.handlers[event].length; i++){
var handlerPair = customEvents.handlers[event][i];
handlerPair[1](handlerPair[0], data);
}
}
},
}
用法:
// register event handler
customEvents.registerEventHandler(eventName, targetObject, handlerFunction)
// fire event
customEvents.fireEvent(eventName, data)
// handlerFunction will be passed two parameters: targetObject and event data
我的解决方案
var customEvents = {
_handlers : {},
subscribe: function(event, handler){
if(typeof(this._handlers[event])=="undefined")
this._handlers[event]=[];
this._handlers[event].push(handler);
},
fire:function(event, data){
if(this._handlers[event]){
for(var i = 0; i < this._handlers[event].length; i++){
this._handlers[event][i](data);
}
}
}
};
var myObj1 = new function(){
this.handler = function(data){
console.log(data+'1');
};
customEvents.subscribe("greatEvent", this.handler);
};
var myObj2 = new function(){
this.handler = function(data){
console.log(data+'2');
};
customEvents.subscribe("greatEvent", this.handler);
};
//if something happened somewhere, then run the event
customEvents.fire("greatEvent", 'ta-da');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.