2012-03-09 5 views
0

私は、一貫性のある動作でチェーン接続できないことが分かりました。下のコードでは、ウィジェットのonCustomClickメソッドが呼び出されていますが、接続されている関数は呼び出されません。私が持っている回避策は、onCustomClick2を使って何をしたかです。ここでは、単に他のメソッドを呼び出す内部メソッドにイベントをアタッチします。内部メソッドを持たなくてもこのコードを書く方法はありますか?古い(とあなたが結合しているメソッド)を呼び出し、新しい機能を持つメソッドを再定義することで動作dojo.connectチェインdojo.connect

<!DOCTYPE html> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Dojo Connect Issue</title> 
</head> 
<body> 

<div id="content"></div> 

<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.7/dojo/dojo.js" data-dojo-config="isDebug: true"></script> 
<script type="text/javascript"> 
    require(["dojo/domReady!", "dojo/parser", "dijit/_Widget", "dijit/_Templated"], function(dr, p, w, t) { 

     dojo.declare("W1", [w, t], { 

      templateString: '<div>Click Me</div>', 

      postCreate: function() { 
       this.inherited(arguments); 
       this.connect(this.domNode, 'onclick', this.onCustomClick); 
       this.connect(this.domNode, 'onclick', this._onCustomClick2); 
      }, 

      onCustomClick: function() { 
       console.debug('onCustomClick'); 
      }, 

      _onCustomClick2: function() { 
       this.onCustomClick2(); 
      }, 

      onCustomClick2: function() { 
       console.debug('onCustomClick2'); 
      }, 
     }); 

     var w = new W1({}, dojo.byId('content')); 

     dojo.connect(w, 'onCustomClick', function() { 
      console.debug('End Consumer - onCustomClick'); // never gets called??? 
     }); 
     dojo.connect(w, 'onCustomClick2', function() { 
      console.debug('End Consumer - onCustomClick2'); 
     }); 
     w.startup(); 

    }); 
    </script> 
</body> 
</html> 

答えて

2

ので、ここで実行の順序に基づいて、のPostCreateはの一つの定義に結合し、 onCustomClickメソッドを呼び出すと、dojo.connectは別のバインドにバインドされます。 (クレイグの補正で編集)

dojo.connect(this.domNode, 'onclick', this, 'onCustomClick');

+1

this.connect(this.domNode、 'onclick'、 'onCustomClick');正しい構文です。これはdojo.connectを実行していた場合に必要でしたが、あなたの説明は正しいものでした。ありがとう。 –

0

私はあなたが間違ったアプローチを取っていると思う:onCustomClick方法の怠惰な検索を行うと、接続署名を使用してみてください。これらのイベントハンドラのすべてが同じイベントによってトリガされている場合、あなたは自分のメインイベントハンドラトリガーそれらのすべてを持っている必要があります。

postCreate: function() { 
    this.inherited(arguments); 
    dojo.connect(this.domNode, 'onclick', this, function(event) { 
    this.onCustomClick(event); 
    this._onCustomClick2(event); 
    }); 
} 

はまた、オブジェクトを作成するためにdojo.declareを使用してありませんthis.connectが存在しないことに注意してください引き続きdojo.connectを使用する必要があります。その後、別の方法として

、チェーンは、あなたが本当に欲しいものである場合は、Builderパターンをたどり、(私は次のことをテストしていない)チェーンの呼び出しにあなたをできるようになる、dojo.nodeListでオブジェクトをラップしてみてください。

var w = new W1({}, dojo.byId('content')); 

new dojo.NodeList(w). 
    .connect('onCustomClick', dojo.hitch(w, w.onCustomClick)) 
    .connect('onCustomClick2', dojo.hitch(w, w.onCustomClick2)); 

w.startup(); 
+0

私が投稿したコードは、私のユースケースの一般的なバージョンです。私が参照する連鎖は、onCustomClickとonCustomClick2ではなく、onclickイベントをウィジェットのonCustomClickメソッドに接続してから、そのウィジェットのonCustomClickメソッドをウィジェット外の別の関数に接続しようとします。 onCustomClick2は私の回避策を示しています。 W1は_Widgetを継承し、そこからthis.connectを取得します(_WidgetBase経由)。 –

+0

私の使用例は、ユーザーがある領域をクリックするウィジェットがあることです。このウィジェットは2か所で使用され、発生する動作は親コンテナによって異なります。だから私は親コンテナがメソッドに接続し、適切な機能を実行したい –

関連する問題