2012-03-09 2 views
0

일관된 동작으로 연결을 연결할 수 없음을 발견했습니다. 아래 코드에서 위젯의 onCustomClick 메서드가 호출되었지만 연결된 함수는 호출되지 않습니다. 내가 가진 해결 방법은 onCustomClick2를 사용하여 수행 한 작업입니다. 여기에서 이벤트를 단순히 다른 메서드를 호출하는 내부 메서드에 첨부합니다. 내부 메서드가 없어도이 코드를 작성할 수 있습니까? 그래서 여기 실행 순서에 따라 이전 (그리고 당신이 결합하고있는 방법)를 호출하는 새로운 기능을 가진 방법을 재정 의하여 작동 dojo.connectChaining 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 방법의 게으른 조회를 할 것이다 연결 서명을 사용해보십시오. 이 이벤트 핸들러 모두가 같은 이벤트에 의해 트리거되는 경우, 당신은 당신의 메인 이벤트 핸들러가 모두 트리거가 있어야합니다 또한 객체를 생성하는 dojo.declare를 사용하여 제공되지 this.connect이 없음을 유의

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

을, 여전히 dojo.connect을 사용해야합니다. 체인은 당신이 정말로 원하는 경우

또는, 다음 (나는 다음과 같은 테스트하지 않았습니다) 빌더 패턴을 다음과 연쇄 전화에 당신을 허용 할 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가 아니라 위젯의 onCustomClick 메소드에 onclick 이벤트를 연결 한 다음 위젯의 onCustomClick 메소드를 위젯 외부의 다른 함수에 연결하려고합니다. onCustomClick2는 제 해결 방법을 보여줍니다. W1은 ​​_Widget을 확장하고 거기에서 this.connect를 가져옵니다 (_WidgetBase를 통해). –

+0

나의 유스 케이스는 사용자가 영역을 클릭하는 위젯이 있다는 것이다. 이 위젯은 몇 곳에서 사용되며 발생해야하는 동작은 상위 컨테이너에 따라 다릅니다. 그래서 부모 컨테이너가 메서드에 연결하고 적절한 기능을 수행하기를 원합니다. –

관련 문제