2010-12-16 81 views
3

我无法找到如何实现这一点(我的自由泳纪录道歉):自定义事件(观察者模式)

//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的,原型,YUI,...)

+0

这可能是太含糊得到有用的回应。一般来说,观察者模式很容易实现,并且有很多来源可以完全解释它(包括维基百科),我还推荐Freeman和Freeman的'Head First Design Patterns',否则,只需google它。) – jakev 2010-12-16 08:41:56

+2

@Jake'头首先设计模式'的目标是在Java,因此没有大的帮助的JavaScript。内部工作是完全不同的。 – 2010-12-16 09:23:01

回答

10

没有JS库,请(jQuery的,原型,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 
+0

我根据你的回答提出了我的解决方案,谢谢,它有效。 – Kalinin 2010-12-17 08:40:07

+0

@Kalinin感谢您的反馈 – 2010-12-17 08:42:04

3

我的解决办法:

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');