2012-05-06 28 views
1

次のメディエータ・パターンの実装では、なぜinitializeメソッドのthis.nameが未定義ですか?私はそれがTestObjectになることを期待していました。どうすればこれを達成できますか?JavaScriptメディエーターパターン。コンポーネント名は定義されていません

また、TestObjectの新しいインスタンスを作成するにはどうすればよいですか?

Mediator = function() { 

     var debug = function() { 
      // console.log or air.trace as desired 
     }; 

     var components = {}; 

     var broadcast = function(event, args, source) { 
      var e = event || false; 
      var a = args || []; 
      if (!e) { 
       return; 
      } 
      //debug(["Mediator received", e, a].join(' ')); 
      for (var c in components) { 
       if (typeof components[c]["on" + e] == "function") { 
        try { 
         //debug("Mediator calling " + e + " on " + c); 
         var s = source || components[c]; 
         components[c]["on" + e].apply(s, a); 
        } catch (err) { 
         debug(["Mediator error.", e, a, s, err].join(' ')); 
        } 
       } 
      } 
     }; 

     var addComponent = function(name, component, replaceDuplicate) { 
      if (name in components) { 
       if (replaceDuplicate) { 
        removeComponent(name); 
       } else { 
        throw new Error('Mediator name conflict: ' + name); 
       } 
      } 
      components[name] = component; 
     }; 

     var removeComponent = function(name) { 
      if (name in components) { 
       delete components[name]; 
      } 
     }; 

     var getComponent = function(name) { 
      return components[name] || false; 
     }; 

     var contains = function(name) { 
      return (name in components); 
     }; 

     return { 
      name  : "Mediator", 
      broadcast : broadcast, 
      add  : addComponent, 
      rem  : removeComponent, 
      get  : getComponent, 
      has  : contains 
     }; 
    }(); 


    // Components  
    Mediator.add('TestObject', function() { 

     var someNumber = 0; // sample variable 
     var someString = 'another sample variable'; 

     return { 
      onInitialize: function() { 
       // this.name is automatically assigned by the Mediator 
       alert(this.name + " initialized."); 
      }, 
      onFakeEvent: function() { 
       someNumber++; 
       alert("Handled " + someNumber + " times!"); 
      }, 
      onSetString: function(str) { 
       someString = str; 
       alert('Assigned ' + someString); 
      } 
     } 
    }()); 

    Mediator.broadcast("Initialize");     
    Mediator.broadcast('FakeEvent');     
    Mediator.broadcast('SetString', ['test string']); 
    Mediator.broadcast('FakeEvent');     
    Mediator.broadcast('SessionStart'); 

答えて

2

それはあなたが戻っている機能ブロックで、thisは、ブロックそのものを表しているので、ないメディエーターオブジェクト(あなたがそれを見てonInitializeconsole.log(this);を試すことができます)です。

EDIT

があなたのコールバックに名前のコンポーネントを追加するには、名前の多くがあったこと

var addComponent = function(varName, component, replaceDuplicate) { 
    if (varName in components) { 
     if (replaceDuplicate) { 
      removeComponent(varName); 
     } else { 
      throw new Error('Mediator name conflict: ' + varName); 
     } 
    } 
    components[varName] = component; 
    components[varName].name = varName; 
}; 

ような何かを行うことができますので、私はvarName

にローカル nameを変更しました
+0

this.nameは私に "TestObject"を与えるべきだと思いましたか? – XGreen

+1

"name"は、コールバックとして持っているオブジェクトの値ではありません。実際、名前はMediatorの属性として存在するものではなく、単にコンポーネント[名前]を定義するために使用される文字列を移送するために使用される単なるローカル変数です。名前変数へのアクセスについては、編集済み回答を参照してください。 –

+0

申し訳ありませんが、TestObjectの別のインスタンスを作成する手助けをしますか? – XGreen

関連する問題