вызов jQuery .remove() в пользовательском виджете пользовательского интерфейса вызывает бесконечный цикл

Я создал кастомный виджет jQuery UI под названием uiPopover, очень похожий на UI-диалог (на самом деле большая часть кода копипаст из него). Этот виджет имеет собственный метод уничтожения, который скрывает виджет и удаляет его из DOM. Опять же, это в значительной степени копипаст из UI-диалога.

    destroy: function() {
        var self = this;

        if (self.overlay) {
            self.overlay.destroy();
        }
        self.close();
        self.element
            .removeData('popover');
        self.uiPopover.remove();
        console.log('afterRemove')

        return self;
    },

Странно то, что это вызывает бесконечный цикл, который выдает некоторые ошибки:

$('#element').popover();
$('#element').remove();

Насколько я вижу, проблема в том, что когда я вызываю .remove(), он автоматически вызывает destroy() в моем виджете (это встроено в пользовательский интерфейс jQuery), а метод destroy пытается снова вызвать remove() на мой элемент, а затем снова пытается вызвать destroy() и так далее..

Однако странно то, что этого не происходит с диалоговым окном пользовательского интерфейса. Итак, когда я делаю это:

$('#element').dialog();
$('#element').remove();

Все в порядке... Должно быть, что-то не так с моим плагином, но я не могу понять, что именно.

Вот полный исходный код моего плагина: https://gist.github.com/2208569


person ragulka    schedule 26.03.2012    source источник


Ответы (1)


Вы мало что можете сделать с рекурсивным вызовом destroy(), кроме изменения самого пользовательского интерфейса jQuery. Однако вы можете разорвать цепочку, предотвратив повторный вызов remove():

destroy: function() {
    var self = this;

    if (self.overlay) {
        self.overlay.destroy();
    }
    self.close();

    if (self.element.data("popover")) {
        self.element.removeData("popover");
        self.uiPopover.remove();
    }

    return self;
}

Обратите внимание, что вам не нужно копировать и вставлять код для расширения существующих виджетов, поскольку структура виджетов поддерживает наследование прототипов. Было бы интересно узнать, возникает ли ваша проблема, если ваш виджет получен из $.ui.dialog вместо дублирования его кодовой базы.

person Frédéric Hamidi    schedule 26.03.2012
comment
Спасибо! Кажется, это помогает. Было бы интересно узнать, почему с $.ui.dialog это не так. Может быть, когда у меня будет больше времени, чтобы поиграть с ним... - person ragulka; 26.03.2012