2012-03-16 13 views
1

私は、init()関数でウィンドウロードイベントをバインドして、C.Test.init()関数を複数回呼び出すことができるJSソリューション/デザインパターンを探しています。残念ながら、私はこれを動作させることはできません。誰もこれで私を助けることができますか?JavaScriptデザインパターンの実装方法

var C = {}; 

    C.Test = (function(C) 
    { 
     var me = {}; 

     me.init = function(config) 
     { 
      me._config = config; 
      $(window).bind('load.' + config.name, me, me.sayHello); 
     } 

     me.sayHello = function(e) 
     { 
      // this doesn't work: 
      document.write('HELLO ' + me._config.name + '<br>'); 

      // this doesn't work either: 
      document.write('SALVE ' + e.data._config.name + '<br>'); 
     } 

     return { 
      init : me.init 
     } 

    })(C); 

    C.Test.init({ 
     name: 'John' 
    }); 

    C.Test.init({ 
     name: 'Kate' 
    }); 

ここJSフィドルのリンクです:http://jsfiddle.net/4Ss8L/

+1

なぜこれをjQueryとタグ付けしましたか? jQueryソリューションが必要ですか? – deed02392

+0

jqueryを使用してロードイベントをバインドしているためです。 jqueryのソリューションでも十分です。 –

答えて

2

はこれをチェック

http://jsfiddle.net/4Ss8L/2/

私に閉鎖問題のように思えます。

+0

もしあなたがevent.dataにデータを追加したいのなら、このようなことをしなければなりません。 '$(ウィンドウ).bind( 'ロード' + config.name、function(c){リターン関数理由は、あなたがデータにアクセスするためにシングルトンやむしろオブジェクトを使用しているということです。時間が経つにつれて、私たちは、(e){e.data = c; me.sayHello.call(this、e);}}(config)ウィンドウのロードが開始され、_configが変更され、古いデータ参照がオーバーライドされます。 はここのフィドルリンクhttp://jsfiddle.net/4Ss8L/3/ – Sushil

+0

素晴らしいです。 @スシルありがとう!しかしもう1つの質問:本当に必要な "リターン"ですか?それなしでも動作します。 –

+0

@santacruzいいえ、あなたのシナリオでは不要ですが、場合によってはそうです。しかし、return文を削除すると、イベントオブジェクトは取得されません。私が私の前のコメントの中で私に与えたフィドルのリンクを確認してください。 – Sushil

関連する問題