Возможно ли отключить все обработчики событий в Dojo? - PullRequest
0 голосов
/ 16 мая 2009

Некоторый код, с которым я работаю, заменяет некоторые элементы HTML, у которых есть прослушиватели событий Dojo, новым HTML, исходящим от вызова AJAX (используя .innerHTML =). Я прочитал, что слушатели событий должны быть отключены с помощью метода dojo.disconnect (handle) перед их заменой, чтобы предотвратить утечки памяти.

Можно ли получить все дескрипторы, связанные с конкретным элементом, чтобы я мог передать каждый из них в .disconnect (дескриптор), или я должен сохранить этот список в моем коде?

Ответы [ 2 ]

5 голосов
/ 16 мая 2009

На самом деле, если вы используете виджеты, они обычно должны отключать вещи в методе destroy (). Если вы сами обрабатываете узлы, я вижу два пути, по которым вы можете идти.

1) Управлять всеми соединениями вручную, значит хранить их где-то. 2) Вероятно, более безопасный: хранить все обработчики подключений в узле, к которому они подключаются, вот так:

node._connectHandlers = [];
node._connectHandlers.push(dojo.connect(node, "onclick", ...));

А позже вы можете просто отключить их все, используя

dojo.query("*", nodeContainingConnects).forEach(function(node){
    if (typeof node._connectHandlers!="undefined"){
        dojo.forEach(node._connectHandlers, "dojo.disconnect(item)");
    }
});

На самом деле, это может работать хорошо, но может быть более эффективный способ получить все соединения по узлам. Я просто не нашел это. НТН

1 голос
/ 09 сентября 2011

После ответа Вольфрама Крисинга это можно «улучшить»:

dojo._connect_tmp = dojo.connect;
dojo.connect = function (obj, event, context, method, dontFix) {
    if(obj._connectHandlers == undefined){ obj._connectHandlers = [];}
    var handler = dojo._connect_tmp (obj, event, context, method, dontFix);
    obj._connectHandlers.push(handler);
    return handler;
};

dojo.iwanttobefree = function (obj) {
   if(obj._connectHandlers == undefined) {
   } else {
      dojo.forEach(obj._connectHandlers, "dojo.disconnect(item)");  
   }
};

Тогда вы можете сделать это:

dojo.connect(myObj, 'onfocus', function(){alert('weee')});
dojo.iwanttobefree(myObj);

Замена кода dojo может быть очень и очень уродливой по нескольким причинам, поэтому, возможно, вы захотите создать собственное пространство имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...