dojo.connect 중에 반환된 "핸들"이 없는 경우 dojo 연결 이벤트를 어떻게 제거합니까?

StackOverflow https://stackoverflow.com/questions/1214624

  •  06-07-2019
  •  | 
  •  

문제

dojo.connect 중에 반환된 "핸들"이 없는 경우 dojo 연결 이벤트를 어떻게 제거합니까?

내 예에는 이벤트 집합을 개체 집합에 동적으로 할당하는 작업이 포함됩니다.(단순화를 위해 이벤트는 onclick 및 ondblclick이고 개체는 테이블 내의 행입니다.)

따라서 페이지 설정 중에 이벤트가 각 행(onclick, ondblclick)에 연결됩니다.이제 사용자의 욕구/행동에 따라 한 행에서 하나의 이벤트를 제거해야 하는 필요성이 발생합니다.그러나 원래 핸들은 더 이상 사용할 수 없습니다.이로 인해 다음은 작동하지 않습니다. dojo.disconnect(row, "onclick", ??*).원래 행 구조를 해킹하지 않고 이 문제를 어떻게 해결할 수 있나요?

물론 어떤 도움이라도 대단히 감사하겠습니다.

도움이 되었습니까?

해결책

내가 일반적으로하는 것은 핸들을 만들 때 손잡이를 저장하여 나중에 연결을 끊을 수 있습니다. 같은 것 :

 var connects = {};

 // then later on
 var node = dojo.create(....); // or someting else that gives you a node
 dojo.forEach( ['click','ondblclick' ], function( evt, idx ) {
   if (!connects[node.id]) {
     connects[node.id] = [];
   }
   connects[ node.id ][idx] = dojo.connect( node, evt, function(evt) { .... });
 });

그런 다음 나중에 다음과 같이 연결을 끊을 수 있습니다.

 dojo.forEach( connects[node.id], function( handle ) {
   dojo.disconnect( handle );
 });

이에 대한 비슷한 코드 샘플이 있습니다 도코 캠퍼스

다른 팁

귀하의 질문에 대한 답은 DOJO.Connect 작업 중에 반환 된 "핸들"을 잃어버린 경우 이벤트를 분리하는 것이 불가능하다는 것입니다. Dojo 코드 자체를 많이 해킹 할 준비가 된 경우를 제외하고.

나중에 연결을 끊으려면 어딘가에 보관해야합니다.

Seth와 마찬가지로 이벤트 제거를 위한 패턴이 있습니다. 핸들을 배열(의사 코드)로 수집합니다.

var handles = [
  dojo.connect(...),
  dojo.connect(...),
  dojo.connect(...)
];

동적으로 연결하면 그냥 수집합니다.

var handles = [];
...
handles.push(dojo.connect(...));
...
handles.push(dojo.connect(...));

여러 이벤트를 정기적으로 연결하면 사용할 수 있습니다. dojo.map():

var handles = dojo.map(["click", "ondblclick"], function(evt){
  return dojo.connect(node, evt, ...);
});

깔끔한 부분은 나중에 편리한 한 줄로 모든 연결을 끊을 수 있다는 것입니다.

dojo.forEach(handles, dojo.disconnect);

귀하의 경우 Seth가 보여준 것과 같은 사전을 사용하여 동일한 작업을 수행할 수 있습니다.

var handles = {};
...
handles[node.id] = dojo.map(["click", "ondblclick"], function(evt){
  return dojo.connect(node, evt, ...);
});

따라서 나중에 다음과 같이 핸들러의 연결을 끊을 수 있습니다.

dojo.forEach(handles[node.id], dojo.disconnect);

Seth'와 내 스케치가 귀하의 경우에 도움이 되는지 확인해 보세요.그렇지 않은 경우 자세한 내용을 알려주십시오.

Dojo는이를 수행 할 방법이 없지만 표준 JavaScript로 이름의 이름을 제거 할 수 있습니다.

node.removeEventListener ("click", clickFunction, false);

여기에서 실제로보십시오. 그러나 RemoveEventListener는 Internet Explorer의 경우 IE9에서만 지원됩니다. 다른 모든 주요 브라우저에서 작동해야합니다.

이벤트가 Dijit 위젯에 연결되어 있으면 이벤트에서 모든 핸들러를 재정의 할 수 있습니다.

dijit.byId(widgetid).onClick = function() {
    // click handler or empty function goes here
}

첨부 된 모든 기능 click 해당 위젯의 핸들러는 새로운 클릭 핸들러로 교체됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top