Como você remover um dojo evento conectado se você não tem o “pega” que foi devolvido durante o dojo.connect?

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

  •  06-07-2019
  •  | 
  •  

Pergunta

Como você remover um dojo evento conectado se você não tem o "pega" que foi devolvido durante o dojo.connect?

Meu exemplo envolve a atribuição dinâmica de um conjunto de eventos para um conjunto de objetos. (Para simplificar, os eventos são onclick e ondblclick, e os objetos são linhas dentro de uma tabela)

Assim, durante os eventos de configuração de página estão ligados a cada linha (onclick, ondblclick). Agora, dependendo de desejos / ações do usuário, uma necessidade de remoção de um evento a partir de uma linha é necessária. Mas a alça original já não está disponível. Por isso, o seguinte não irá funcionar: dojo.disconnect(row, "onclick", ??*). Como faço para contornar isso sem cortar a estrutura linha original?

Qualquer ajuda é, naturalmente, muito apreciada.

Foi útil?

Solução

O que eu costumo fazer é salvar as alças quando eu criá-los para que eu possa desligá-los mais tarde. Algo como:

 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) { .... });
 });

Então, mais tarde, em que você pode desconectar como:

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

Há um exemplo de código semelhante para isso no DojoCampus

Outras dicas

A resposta à sua pergunta é que é impossível a desconexão evento se você perdeu o "pega" que foi retornada durante a operação dojo.connect. Exceto se você está pronto para fazer pesado hackers de dojo próprio código.

Você deve armazená-los em algum lugar se quiser desligá-los mais tarde.

Como Seth Eu tenho meus padrões para a remoção de eventos - Eu coleciono alças em matrizes (pseudo-código):

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

Se eu ligar dinamicamente Eu apenas coletá-los:

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

Se eu ligar vários eventos de forma regular posso usar dojo.map():

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

A parte interessante é que, mais tarde eu posso desligar todos eles com um one-liner útil:

dojo.forEach(handles, dojo.disconnect);

No seu caso, você pode usar um dicionário como mostrado por Seth para realizar a mesma:

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

Então, depois que você pode desconectar manipuladores assim:

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

Veja se Seth' e meu esboços ajuda no seu caso. Se não, nos dê mais detalhes.

Mesmo que dojo não tem uma maneira de fazer isso, você pode remover uma função chamada com JavaScript padrão:

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

Veja em ação aqui . No entanto, removeEventListener só é suportado a partir do IE9 para o Internet Explorer. Ele deve funcionar em todos os outros principais navegadores.

Se o evento estiver conectado a um Dijit widget, você pode substituir todos os manipuladores sobre o evento assim:

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

Qualquer e todas as funções ligadas ao manipulador click para esse widget será substituído por seu manipulador de clique novo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top