2010-12-16 20 views
3

私は(私はフリースタイルレコードをお詫び申し上げます)これを実装する方法を見つけることができません。カスタムイベント(Observerパターン)

//assign the event handler for the object "myObj"  
myObj.onMyEvent = //do something 

//if something happened somewhere, then run the event 
MyEvent.fire(); 

アイデアは、我々は(生成)いくつかのカスタムイベント(MyEvent)を呼び出すことです。私たちは、 "MyEvent"の出現を認識し、何らかの形で(自分のやり方で)それに応答することができるオブジェクト "myObj"を持っています。 さらに、他のオブジェクト(異なるソート)があり、それらは(自分の方法で)「MyEvent」に反応します。

私は「オブザーバーパターン」があることを知っていますが、特定の実装を見つけることはできません。

あなたはそれについて読むべきところを教えてください。 自然界では一般的に不可能ですか? それは全く違うことですか?

アップデート1:ノーJS LIBS、(jQueryの、プロトタイプ、YUI、...)してください

+0

これはおそらく取得するにはあまりにも曖昧です有用な反応。一般的に、オブザーバーのパターンは簡単に実装することができ、それを完全に説明する多くの情報源があります(wikipediaも含めて、私はFreemanとFreemanの「ヘッドファーストデザインパターン」を推奨します)。 – jakev

+2

@Jake ' Head First Design Patterns 'はJavaでターゲット設定されているため、javascriptでは大きな助けにはならない。内部の仕組みはまったく異なっています。 –

答えて

10

なしのJS LIBS、(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

+0

@Kalininからフィードバックいただきありがとうございます –

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'); 
関連する問題